匿名函数.call(this)与直接调用匿名函数(this)的等价性疑问
两段IIFE写法的区别分析
先看你给出的两段代码:
第一段代码:
(function(r) { var ExcelApp; ExcelApp = (function() { .... }).call(this); return r.ExcelApp = ExcelApp; })(this);
第二段代码:
(function(r) { var ExcelApp; ExcelApp = (function() { .... })(this); return r.ExcelApp = ExcelApp; })(this);
这两种写法并非在所有场景下等价,核心区别在于内部函数的this指向和参数传递逻辑:
对于
.call(this)的写法:
它通过Function.prototype.call()方法,直接将外层函数的this绑定到内部函数的this上。内部函数里可以直接用this访问这个绑定的值,不需要额外定义参数接收。对于
(this)的写法:
这是把外层的this作为普通参数传给内部函数,内部函数如果要使用这个值,必须通过定义形参(比如function(arg) { ... })来接收。而内部函数自身的this,则遵循普通函数调用的规则:非严格模式下指向全局对象(浏览器里是window,Node.js里是globalThis),严格模式下则是undefined。
什么时候看起来等价?
如果内部函数既没有使用this关键字,也没有接收并使用传入的参数,那两种写法运行后的结果会完全一致,看起来像是等价的。
第一段用.call(this)的原因
大概率是内部函数的逻辑里需要用到绑定后的this,或者是为了规避严格模式下普通函数调用时this变为undefined的问题,通过call明确指定this指向,让代码在严格/非严格模式下的表现更一致。
内容的提问来源于stack exchange,提问作者shenkwen
相关产品推荐
相关产品推荐

