JavaScript动态关闭范围

我遇到了一个关闭问题,并想确认一个怀疑。 我试图给一个函数访问它最初定义的范围之外的范围。 例如下面的代码块就像我期望的那样工作。

(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()();

}());

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

请让我知道,如果我必须更好地解释。

====编辑====

好的,所以定义该函数将创建该范围并且不使用该函数。 下面的代码段没有定义函数吗?

(function(){

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

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

}());

如果新函数在内存中的那个点上定义了一个函数,它应该无法访问测试变量?


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

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

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

下面的代码段没有定义函数吗?

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

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


如果所有的功能都在同一个对象下定义,那么你可以使用它

(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)来传递引用,这样你就可以访问其他的对象属性。

链接地址: http://www.djcxy.com/p/51613.html

上一篇: JavaScript Dynamic Closure Scope

下一篇: Minimum viable JavaScript closure