在新调用的函数中,`new Function(" return this")()`的目的是什么?

时间:2015-04-17 17:55:30

标签: javascript

我正在审核setImmediate polyfill并将其包含在即时调用函数中,其中包含以下内容:

(function (global, undefined) {
    "use strict";
...
}(new Function("return this")()));

我对最后一个语句和传递给函数的参数的目的感到困惑。这个代码可以在浏览器和Node.js中运行吗?你能澄清一下吗?

3 个答案:

答案 0 :(得分:10)

编写代码使其可以访问全局范围,而无需知道包含该范围的对象是什么。例如,在浏览器中,全局范围是window,但在其他容器中则不是这样。

通过使用Function constructor,您可以直接访问全局范围:

  

注意:使用Function构造函数创建的函数不会创建   封闭他们的创作背景;他们总是在   全球范围。运行它们时,它们只能访问   他们自己的局部变量和全局变量,而不是范围内的变量   其中调用了Function构造函数。这不同于   使用eval和函数表达式的代码。

通过这样做:

(new Function("return this")())

您可以在全局范围上创建和调用新函数,该函数返回全局范围。然后立即将其作为global对象传递给main函数。

答案 1 :(得分:6)

在非严格模式下,当调用函数而不设置this值时,它将成为全局对象:

  

10.4.3 Entering Function Code

     
      
  1. 如果功能代码是严格代码,请将ThisBinding设置为 thisArg
  2.   
  3. 如果 thisArg null 未定义,请将ThisBinding设为   全球对象。
  4.   

因此,this keyword可能会获得对global object的引用:

this; // the global object

第一个问题是this可以自定义(例如applycall):

(function() {
    this; // `123`, not the global object!
}).call(123);

这可以使用自执行功能轻松修复:

// `this` may not be the global object here
(function() {
    this; // the global object
})();

但是存在一个更严重的问题:this在严格模式下不会成为全局对象:

'use strict';
(function() {
    this; // `undefined`, not the global object!
})();

要解决此问题,您可以使用Function Constructor。即使在严格模式下,默认情况下新函数也是非严格的。

'use strict';
(function() {
    new Function("return this")(); // the global object
})();

答案 2 :(得分:-1)

无论js运行时是什么,都获取全局对象;(例如,节点,浏览器等);