如何在从循环调用的方法中动态分配参数
How to dynamically assign arguments in a method call from loop?
遇到一个奇怪的问题,也许最好用代码来解释:
var fruits = ["apples", "oranges", "pears"];
var Breakfast = {
_consume : function (fruit) {
Breakfast[fruit]._numConsumed++;
}
};
for (var f in fruits) {
var fruit = fruits[f];
Breakfast[fruit] = {
consume : function () {
Breakfast._consume(fruit);
},
_numConsumed: 0
}
}
Breakfast.pears.consume();
Breakfast.pears.consume();
Breakfast.apples.consume();
Breakfast.apples.consume();
Breakfast.apples.consume();
console.log("Pears eaten: " + Breakfast.pears._numConsumed);
console.log("Apples eaten: " + Breakfast.apples._numConsumed);
结果是:
$ node example.js
Pears eaten: 5
Apples eaten: 0
不确定如何克服这种行为?
我写错了什么吗?还是我应该用另一种模式?(假设我想让"消费"函数对我所有的水果都可用)
多谢!
问题是变量总是for循环的最后一个。更简单的方法是在创建的对象中定义属性。
。
var fruits = ["apples", "oranges", "pears"];
var Breakfast = {
_consume : function (fruit) {
Breakfast[fruit]._numConsumed++;
}
};
for (var f in fruits) {
var fruit = fruits[f];
Breakfast[fruit] = {
id:fruit,
consume : function () {
Breakfast._consume(this.id);
},
_numConsumed: 0
}
}
您在使用函数闭包时遇到了一些麻烦。这个问题有一个很好的解释:JavaScript闭包是如何工作的?
你的问题是这一行:
Breakfast._consume(fruit);
总是等同于
Breakfast._consume(fruits[2]);
一旦你的for
循环完成运行。
你可以通过为每个f
赋予整个循环自己的上下文来解决它:
for (var f in fruits) {
(function(f) {
var fruit = fruits[f];
Breakfast[fruit] = {
consume : function () {
Breakfast._consume(fruit);
},
_numConsumed: 0
}
})(f);
}
…会导致……
"Pears eaten: 2"
"Apples eaten: 3"
但这是一个相当粗糙的解决方案。我相信,一旦您通读了函数闭包如何工作的解释,您就会想出更好的方法。
编辑回答:
var fruits = ["apples", "oranges", "pears"];
var Breakfast = {
_consume : function (fruit) {
console.log('other'+JSON.stringify(fruit));
Breakfast[fruit]._numConsumed++;
}
};
for (var f in fruits) {
//var fruit = fruits[f];
Breakfast[fruits[f]] = {
fruit: fruits[f],
consume : function () {
Breakfast._consume(this.fruit);
},
_numConsumed: 0
}
}
Breakfast.pears.consume();
Breakfast.pears.consume();
Breakfast.apples.consume();
Breakfast.apples.consume();
Breakfast.apples.consume();
console.log("Pears eaten: " + Breakfast.pears._numConsumed);
console.log("Apples eaten: " + Breakfast.apples._numConsumed);
相关文章:
- 动态分配GA增强型电子商务跟踪器
- 动态分配类“;不是构造函数”;
- 如何使用Handlebars在父视图中动态分配部分视图
- 角度:动态分配ng选项,奇怪的行为
- 如何为跨度动态分配宽度
- 错误 405 方法未分配异常,当使用 AJAX 与 Laravel 一起发布时
- 如何将号码动态分配给多个 ID
- 在 jQuery/JavaScript 中动态分配对象属性以通过 ajax 发布
- 检测使用 javascript 动态分配的 css 样式/属性
- 为什么使用 javascript 动态分配名称失败了
- 按方法动态更改元素数据
- 动态分配 Javascript 变量.[摆脱 eval()]
- jsTree-使用AJAX/C#Web方法动态填充树
- 为svg对象动态分配数据属性
- jQuery:动态分配的函数不起作用
- 使用jQuery动态分配百分比宽度
- 为jqTree中的节点动态分配HTML/CSS ID
- 如何在React中动态分配属性
- 为对象中的所有方法动态地准备一个参数
- 如何在从循环调用的方法中动态分配参数