Programmer boy 2021-03-17 10:42 采纳率: 0%
浏览 33

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

 

(function(global) {
  global.socket = socket;
})(window);
  • 写回答

2条回答 默认 最新

  • 幻灰龙 2021-03-17 11:22
    关注

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

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

     

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

     

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

    评论

报告相同问题?

悬赏问题

  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条