Function('return this')与(function(){return this})的差异及替换安全性咨询
这问题问得很到位,正好戳中了JavaScript里this绑定和函数创建机制的核心差异,我来给你拆解清楚:
一、
Function('return this')和function(){return this}的核心区别 两者最关键的差异在于严格模式的影响范围和作用域绑定:
- 对于普通函数表达式
function(){return this}:它的this指向完全取决于调用时的上下文,以及它是否处于严格模式环境中。如果它被定义在严格模式的代码块里(比如外部有'use strict'声明),直接调用时this会变成undefined;非严格模式下,this才会指向全局对象。 - 对于
Function('return this')创建的函数:它不受外部严格模式的约束——这个函数的函数体默认运行在非严格模式下(除非你在字符串参数里显式加上'use strict; return this')。所以不管外部代码是不是严格模式,直接调用它时,this都会稳定指向全局对象。
另外,Function构造函数创建的函数不会捕获当前的词法作用域,它的作用域链直接指向全局,而普通函数表达式会继承定义时的词法作用域(不过在直接自执行的场景下,这一点影响不大)。
二、替换成
(function(){return this})()是否安全?有没有失败场景? 这得分情况讨论:
- 如果你的代码永远不会在严格模式环境下运行,那这个替换是完全安全的,两者行为一致,都能拿到全局对象。
- 但如果代码可能运行在严格模式中(比如你的项目开启了严格模式,或者这个模块被引入到严格模式的代码里),那替换就会直接失效:此时
(function(){return this})()会返回undefined,而不是全局对象,后续依赖全局对象的逻辑就会报错。
举个直观的例子:
'use strict'; // 原代码:正常获取全局对象 const globalObj = Function('return this')(); console.log(globalObj); // 浏览器环境是window,Node环境是global // 替换后的代码:返回undefined const globalObj2 = (function(){return this})(); console.log(globalObj2); // undefined
还有一种极端场景:如果这个自执行函数被意外绑定了其他上下文(比如用call/apply调用),不过编译后的模块序言一般都是直接自执行,这种情况很少见,主要风险还是严格模式。
三、为什么编译后的JS模块更倾向于用Function构造函数的方式?
核心原因就是兼容性和稳定性:
编译后的模块需要适配各种运行环境,不管用户的代码是严格模式还是非严格模式,不管模块是不是被包裹在闭包里,都要能稳定获取到全局对象。而普通函数表达式做不到这一点——一旦外部是严格模式,就会返回undefined,直接导致后续逻辑崩溃。
Function('return this')()的方式相当于一个“万能钥匙”,不管外部环境如何,都能精准拿到全局对象,这对于需要保证兼容性的编译模块来说,是最可靠的方案。
总结一下:如果你的解释器环境确定不会涉及严格模式,那替换没问题;但如果要兼容严格模式场景,这个替换就不安全。模块选择Function构造函数,就是为了在所有环境下都能稳定工作。
内容的提问来源于stack exchange,提问作者geoffliu
相关产品推荐
相关产品推荐

