如果变量是全局的,为什么需要在javascript中将参数传递给自执行函数?

Kin*_*rog 5 javascript jquery underscore.js self-executing-function

我正在查看underscore.js库的代码(jQuery做同样的事情)并且只想澄清为什么窗口对象被传递到自执行函数.

例如:

(function() {            //Line 6
  var root = this;       //Line 12
  //Bunch of code
}).call(this);           //Very Bottom
Run Code Online (Sandbox Code Playgroud)

既然this是全局的,为什么它被传递到函数中?以下工作也不会这样吗?这样做会产生什么问题?

(function() {
  var root = this;
  //Bunch of code
}).call();
Run Code Online (Sandbox Code Playgroud)

aps*_*ers 5

我怀疑原因是ECMAScript 5 严格模式.

在非严格模式下,这个IIFE

(function() {
   console.log(this); // window or global
})();
Run Code Online (Sandbox Code Playgroud)

记录window对象(或global对象,如果您在node.js服务器上),因为全局对象是作为this不作为对象方法运行的函数提供的.

将结果与之比较

"use strict";
(function() {
   console.log(this); // undefined
})();
Run Code Online (Sandbox Code Playgroud)

在严格模式下,this裸调用函数是未定义的.因此,Underscore作者用于callthis匿名函数提供显式,以便在严格和非严格模式下进行标准化.简单地调用函数(就像我在我的例子中所做的那样)或者使用.call()导致可以解决的不一致性.call(this).