JavaScript动态闭包范围

时间:2014-07-08 20:02:29

标签: javascript closures

我遇到了关闭的问题,并想确认怀疑。我试图给函数访问最初定义之外的范围。例如,以下代码块可以正常工作。

(function(){

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

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

}());

运行时,会提示字符串“closure access”。

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

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

}());

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

2 个答案:

答案 0 :(得分:0)

  

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

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

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

  

以下代码段是否未定义函数?

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

没有。 Function constructor创建一个没有范围链的函数,就好像它是在全局范围内声明的那样。您需要使用eval

答案 1 :(得分:0)

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

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