关于javascript:是否将窗口对象传递给IIFE可选?

Is passing the window object to an IIFE optional?

本问题已经有最佳答案,请猛点这里访问。

以下示例之间有什么区别吗?

例1:

1
2
3
4
(function (window) {
 'use strict';
  console.log(window)
})(window);

例2:

1
2
3
4
(function () {
 'use strict';
  console.log(window)
})();

传递窗口对象是否可选?


#1并没有多大意义。 window是只读的,无法重新定义,因此无需像#1那样在某个时间点捕获其值。 #2很好。

#1使用的模式主要用于捕获稍后可能被其他代码更改的内容,例如:

1
2
3
4
5
6
7
8
var x = 1;
(function(x) {
    setTimeout(function() {
        console.log("inside, x =" + x);
    }, 100);
})(x);
x = 2;
console.log("outside, x =" + x);

...或者为了获得方便的简写名称:

1
2
3
4
5
(function(d) {
    var div = d.createElement("div");
    div.innerHTML ="Hi";
    d.body.appendChild(div);
})(document);

如果undefined标识符被修改,它也常用于获取undefined

1
2
3
(function(u) {
    console.log(typeof u); //"undefined"
})(/*Note there's no argument passed*/);

现在undefined是只读的,无法重新定义,因此不再需要这样做了。