5

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

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

有没有一种方法可以确保内部 this 始终获得对外部上下文的引用。

我知道我能做到

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

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

4

3 回答 3

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
        })();
 };
于 2013-11-25T21:20:03.140 回答
1

您可以使用闭包变量:

(new function Outer(){
    'use strict';
    console.log(this);
    var me = this;
    (function(){
        console.log(me);
    })();
})();
于 2013-11-25T21:24:03.163 回答
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 */
    })();
})();
于 2013-11-25T21:25:14.487 回答