请问这样包一层的主要目的是什么?为何不直接写window.socket=socket呢?

 

(function(global) {
  global.socket = socket;
})(window);

 

`(function(...){...})(...)` 是 JavaScript 的立即执行函数表达式(IIFE).

  • 函数可以创建一个独立的作用域,避免函数内的变量泄露到全局。但是直接执行 `function(...){...}(...)` 是不行的,这会被认为是两个语句:`function(...){...}` 以及 `(...)`。
  • 先用 `()` 把函数包裹起来,那么`()`内的函数就被识别为一个函数表达式,而不是函数。再对函数表达式的值,也就是一个函数执行调用 (...) 就会立即执行该函数。

 

上面的例子很简单,但是函数体内的代码有可能在一系列的调用中产生把变量污染到全局作用域的行为,使用 IIFE 包裹一层规避了潜在的这种可能。

 

由于 JavaScript 的运行环境多种多样,为了写一个在各种环境下都能制造一个统一名字的全局的 `global` 对象,需要做很多判断来打补丁,TC39 有一个专门的提案解决这个问题,globalThis: https://github.com/tc39/proposal-global

防止变量被污染吧