为什么这不是一个允许内部函数访问外部函数变量的闭包?

时间:2014-03-17 17:36:12

标签: javascript closures prototype

如何启用对变量' 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。我不想将它存储在实例化的对象上(我知道我可以做到)。

1 个答案:

答案 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);
}