【问题标题】:JavaScript Dynamic Closure ScopeJavaScript 动态闭包作用域
【发布时间】:2014-08-29 17:12:45
【问题描述】:

我遇到了关闭问题,并想确认一个怀疑。我试图让函数访问它最初定义的范围之外的范围。例如,以下代码块按我的预期工作。

(function(){

    function Outer () {
        var test = "closure access";
        return function Inner () {
            alert(test);
        };
    };

    // call outer then inner
    Outer()();

}());

当运行字符串“关闭访问”时会发出警报。

但是,如果内部函数在“外部”范围之外定义,然后从“外部”函数返回,则它不再有权访问本地“测试”变量。例如:

(function(){

    function Inner () {
        alert(test);
    };

    function Outer () {
        var test = "closure access";
        return Inner;
    };

    // call outer then inner
    Outer()();

}());

这种行为对我来说是有意义的,因为“外部”函数实际上超出了正常范围以查找在其上方定义的“内部”函数,而内部函数未定义在“外部”的范围内本地变量“测试”。我的问题是,有没有办法在某处(其他地方)定义一个函数,但从另一个函数动态返回它,同时仍保留其闭包函数的变量?

如果我必须更好地解释,请告诉我。

==== 编辑 ====

好的,所以定义函数会创建作用域而不是使用函数。下面的代码sn-p是不是没有定义函数?

(function(){

    function Outer () {
        var test = "closure access";
        return new Function("alert(test);");
    };

    // call outer then inner
    Outer()();

}());

如果新函数在内存中的那个点定义一个函数,它应该没有访问测试变量的权限吗?

【问题讨论】:

  • 不,函数范围是通过定义函数而不是通过使用函数来创建的。
  • 这本质上会给我们私有属性和方法。唉,我们必须下决心把所有东西都放在构造函数中。

标签: javascript closures


【解决方案1】:

我的问题是,有没有办法在某处(其他地方)定义一个函数,但从另一个函数动态返回它,同时仍保留其闭包函数的变量?

没有。您需要在那里定义一个函数来访问该范围内的变量。

但是,您可以在其中动态使用其他功能,以便您可以以某种方式模拟这种行为;尽管如此,您总是需要创建一个新函数。

下面的代码sn-p是不是没有定义函数?

return new Function("alert(test);");

没有。 Function constructor 创建一个没有作用域链的函数,即好像它是在全局作用域中声明的。你需要使用eval

【讨论】:

    【解决方案2】:

    如果所有函数都定义在同一个对象下,那么你可以使用这个

    (function(){
        function Inner () {
           alert(this.test);
        };
        function Outer () {
           this.test = "closure access";
           return Inner;
        };
        // call outer then inner
        Outer()();
    }());
    

    但是如果函数是在不同的对象下定义的,那么你可以使用prototype.call(this) 或prototype.apply(this) 来传递引用,这样你就可以访问其他对象属性。

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2017-06-18
      • 2010-12-20
      • 2010-10-12
      • 2013-03-25
      • 2011-01-19
      • 2014-02-13
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多