【发布时间】:2016-06-05 15:09:15
【问题描述】:
如果我在函数内部定义了内部函数,则内部函数可以访问外部函数的变量。如果我希望这个内部函数可重用并在外部函数之外定义它,则内部函数现在无法访问外部函数变量。如何使这个新的可重用内部函数能够访问外部函数变量,而不将这些变量作为参数传递?
function a () {
var x = [[1,2,3], [1,2,3], [1,2,3]];
var keys = Object.keys(x[0]);
for (var i = 0; i < x.length; i++) {
angular.forEach(keys, loop);
}
}
function loop (key) {
console.log(key, i);//i is undefined here
}
a();
具体来说,有没有什么方法可以不 1) 为其分配变量,2) 不将变量作为参数传递,以及 3) 不创建全局变量?
编辑:似乎没有办法做到这一点。但是如果我尝试另一种方法,让可重用函数返回一个新函数,我也无法访问内部范围。为什么会这样,有什么方法可以实现吗?
function a () {
var x = [[1,2,3], [1,2,3], [1,2,3]];
var keys = Object.keys(x[0]);
var myloop = loop();
for (var i = 0; i < x.length; i++) {
angular.forEach(keys, myloop);
}
}
function loop (key) {
return function(key) {
console.log(key, i);//i is undefined here
};
}
a();
【问题讨论】:
-
可以使用全局变量,虽然不推荐。
-
除了使用全局变量还有什么办法?我认为闭包一定有某种方法,但我无法让它发挥作用。
-
使可重用函数依赖于其范围之外的变量对我来说似乎是一个非常糟糕的主意。将
i传递给函数有什么问题? -
问题是您需要创建一个匿名函数来执行此操作。 angular.forEach(keys, function(key) { loop(key, i)})
-
这个函数应该完成什么?所以
keys包含x中第一个数组的键(或索引值)。然后你迭代a的长度(函数的长度为零,所以循环永远不会运行),如果循环以某种方式执行,你再次循环键。你能澄清一下吗?
标签: javascript scope closures