在许多已编译的Javascript模块中,序言中的某处有一个调用Function('return this')()
来获取全局对象。我在解释器环境中工作,出于安全原因禁止使用Function
构造函数(以及eval
)。我用(function(){return this})()
替换了上面的代码,一切似乎都在起作用。
这是一个安全的替代吗?有没有失败的情况?为什么大多数编译的JS模块都更喜欢构造函数版本?
答案 0 :(得分:3)
在strict mode中你没有获得全局对象;你会得到undefined
:
console.log( window === function(){
return (function(){return this})();
}() ); // true
console.log( window === function(){
"use strict";
return (function(){return this})();
}() ); // false

Function构造函数转义严格模式,因此无论您是否已处于严格模式,都可以得到相同的结果:
console.log( window === function(){
return Function('return this')();
}() ); // true
console.log( window === function(){
"use strict";
return Function('return this')();
}() ); // true

答案 1 :(得分:0)
在第一种情况下,Function('return this')()
在全局范围内声明,并且在非严格模式下,如果调用该函数而未设置此值,则this
将链接到全局对象。
在第二种情况(function(){return this})()
中,您正在创建立即调用的函数表达式。