如何启用对变量' e'在funcB中通过闭包?
<!DOCTYPE HTML>
<html>
<head>
<script>
Test = function () {};
Test.prototype.funcA = function (k) {
var that = this;
return function(e) {
window.console.log('k: ' + k); // 'abc'
window.console.log('e: ' + e); // 'def'
that.funcB(k);
};
};
Test.prototype.funcB = function (p) {
window.console.log('p: ' + p); // 'abc'
window.console.log('e: ' + e); // undefined (why?)
}
obj = new Test();
(obj.funcA('abc'))('def');
</script>
</head>
<body>
</body>
</html>
我对封闭感到困惑。
由于变量e存在于funcA中(打印&#39; def&#39;),为什么funcB不能访问它,因为funcB是由funcA执行的?如何为变量e?
提供funcB访问权限我想通过闭包来访问变量e。我不想将它存储在实例化的对象上(我知道我可以做到)。
答案 0 :(得分:1)
您必须将“e”的值作为参数传递给另一个函数。 JavaScript中的作用域是由函数的词汇关系决定的,而不是动态关系。函数中的代码可以看到“向外”,并且从funcB()
移出不会遇到定义了“e”的范围。 funcB()
中代码可见的唯一符号是它自己的本地符号(在本例中为p
)和全局符号。
现在,您可以将对象本身的“e”副本显式存储为属性:
return function(e) {
window.console.log('k: ' + k); // 'abc'
window.console.log('e: ' + e); // 'def'
that.e = e;
return that.funcB(k);
};
Test.prototype.funcB = function (p) {
window.console.log('p: ' + p); // 'abc'
window.console.log('e: ' + this.e);
}