ningxiaotao 2009-02-20 16:06
浏览 287
已采纳

js代码为什么要写成这样了?

整个一个js中就一个大的function

new function() { 
    .....
}

还有这样的代码

( function() {
        ......
    } )();

不明白出于什么考虑为什么要写成这样

  • 写回答

4条回答 默认 最新

  • rednaxelafx 2009-02-20 17:19
    关注

    为了控制作用域,避免名字冲突。

    JavaScript中变量和函数的作用域遵循词法作用域(静态作用域),有全局作用域与局部作用域。但是与其他常见的C++等语言不同,JavaScript中for循环、单独的语法块({ ... })是不会引入新的局部作用域的;能引入新的局部作用域的只有函数。
    代码中许多短的名字都会经常被用到,例如i、j、x、y,或者helper之类;如果同名的变量以不同的方式被使用,但出现在同一个作用域里,就会出现所谓的“名字空间污染”,比较容易出错。
    举例来说,C++里:
    [code="cpp"]#include
    using namespace std;

    int main() {
    int n = 0;
    for (int i = 0; i < 1; i++) {
    int n = 1; // 声明并初始化了一个新的n;for语句的语句块会引入新的局部作用域
    }
    cout << n << endl; // 0

    return 0;
    

    }[/code]
    然后JavaScript:
    [code="js"]function test() {
    var n = 0
    for (var i = 0; i < 1; i++) {
    var n = 1 // 没有声明新的n;只是对前面的n赋了新值而已
    }
    print(n) // 1
    print(i) // 1;i在此也可以访问
    }[/code]
    JavaScript的函数能引入新的局部作用域,回避了上面的问题;同时也可以创建新的闭包。
    [code="js"]function test() {
    var n = 0
    for (var i = 0; i < 1; i++) {
    (function () { // 声明了一个匿名函数
    var n = 1 // 声明并初始化了新的n
    })() // 直接在声明完匿名函数后调用之
    }
    print(n) // 0
    print(i) // 1;i在此也可以访问
    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料