整个一个js中就一个大的function
new function() { ..... }
还有这样的代码
( function() { ...... } )();
不明白出于什么考虑为什么要写成这样
整个一个js中就一个大的function
new function() { ..... }
还有这样的代码
( function() { ...... } )();
不明白出于什么考虑为什么要写成这样
为了控制作用域,避免名字冲突。
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]