标签:
JavaScript没有块级作用域的概念。这意味着在语句中定义的变量,实际上是在包含函数中而非语句中创建的。
1 function outputNumbers(count){ 2 for(var i=0; i<count; i++){ 3 alert("In: " + i); 4 } 5 var i; 6 alert("Out: " + i); 7 } 8 outputNumbers(2); //In: 0 In: 1 Out:2
在这个函数中定义了一个for循环。而变量i的初始值被设置为0。在其他语言中。变量i定义在for循环的语句块中。循环一旦结束,i 就会被销毁。
可是在JavaScript中。变量 i 属于outputNumbers()。在该函数内部都可以访问。即使重新声明同一个变量,也不会改变他的值。
当多次声明了同一个变量时,JavaScript不会有提示。它只会对后续的声明视而不见,不过他会执行后续声明中的变量初始化(第五行改成 var i = 6; 输出Out: 6 )。
匿名函数函数可以用来模仿块级作用域 并避免这个问题。
块级作用域(通常称为私有作用域)的匿名函数语法如下:
(function(){ //这里是块级作用域 })();
以上代码定义 并立即调用了一个匿名函数。将函数声明包含在一对圆括号中。表示它实际上是一个函数表达式。
紧随其后的另一对圆括号会立即调用这个函数。
无论在什么地方,只要临时须要一些变量,就可以使用私有作用域。
1 function outputNumbers(count){ 2 (function(){ 3 for(var i=0; i<count; i++){ 4 alert("In: " + i); 5 } 6 })(); 7 var i; 8 alert("Out: " + i); 9 } 10 outputNumbers(2); //In: 0 In: 1 Out: undefined
在for 循环外部插入了一个私有作用域。在匿名函数中定义的任何变量。都会在执行结束时被销毁。因此,变量 i 只能在循环中使用。
私有作用域中能够访问变量count,是因为这个匿名函数是一个闭包,它能够访问作用域中的所有变量。
一般来说,我们都应尽量减少向全局作用域中添加变量和函数。这种技术经常在全局作用域中备用在函数外部。从而限制向全局作用域中添加过多的变量和函数。
这种方法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。
标签:
原文地址:http://www.cnblogs.com/PrajnaParamita/p/5796241.html