在javascript中保护全局引用

时间:2013-11-25 21:19:11

标签: javascript scopes

以下javascript代码允许您访问全局对象(窗口/工作者)。

(new function Outer(){
    console.log(this); /* The object */
    (function(){ // This function could be a 3rd Party function 
        console.log(this); /* window !!*/
    })();
});

有没有办法可以确保内部总是能够引用外部的上下文。

我知道我能做到

(new function Outer(){
    'use strict';
    console.log(this); /* The object */
    (function(){ // This function could be a 3rd Party function 
        console.log(this); /* undefined ? !!*/
    })();
});

但这会导致this未定义。

修改

我知道bind,但如果内部函数是嵌套的,那该怎么办呢?例如

之类的东西
(function(){

    (function(){
        (function(){
           console.log(this);// undefined
        })();

    })();

}).bind(this)();

我想要的是:外{} 而不是使用变量引用外部: - |

3 个答案:

答案 0 :(得分:7)

您可以使用function.call

new function Outer(){
    'use strict';
    console.log(this); 
    (function(){ // This function could be a 3rd Party function 
        console.log(this);  //<-- Now it will it the one from the outer scope
    }).call(this);
}; // You don't need to invoke this explicitly here with () since you are invoking it already with new keyword so constructor invocation doesnt need ()

或者最好的选择是将外部缓存在外部并在内部范围内的任何位置使用它。

new function Outer(){
        'use strict';
        var self = this;
        console.log(this); 
        (function(){ // This function could be a 3rd Party function 
            console.log(self);  //<-- Now it will it the one from the outer scope
        })();
 };

答案 1 :(得分:1)

您可以使用闭包变量:

(new function Outer(){
    'use strict';
    console.log(this);
    var me = this;
    (function(){
        console.log(me);
    })();
})();

答案 2 :(得分:1)

这个技巧只是将“外部”this存储在一个变量中,你可以从内部函数(以及内部函数等)访问它。

在某些情况下,这可能很有用,因为您可以访问内部this(如果有上下文)和外部this

(new function Outer(){
    'use strict';
    console.log(this); /* The object */
    var _this = this;
    (function(){ // This function could be a 3rd Party function 
        console.log(_this); /* The outer object */
    })();
})();