对js的函数作用域不是很了解,不像c是块级作用域。且看如下代码:
var scope="global"; function t(){ console.log(scope); var scope="local" console.log(scope); } t();
结果是undefined和local,感到很奇怪。要理解这个分两步走。
1. 如下片段:
function test(){ for(var i=0;i<3;i++){ var j=5; } alert(i); alert(j); } test();
输出是3和5,说明js和c++这些不同,能够访问(非函数)花括号内语句块定义的变量。
2. 如下片段:
function test(){ alert(j); alert(i); var j=1; } test();
此时输出分别是undefined和报错,undefined的原因是运行到alert(j)的时候,找到了函数中变量j的定义,但是还没有运行到赋值阶段。所以j是空的。而alert(i)是因为找不到i这个变量,所以报错了。
而2片段相当于:
function test(){ var j; alert(j); alert(i); j=1; } test();
可见变量在函数体内(非子函数)定义后都是可见的。
那么如何避免块级变量的污染呢,比如我在函数内写一个if块级语句,里面定义了一个变量,要防止它污染这个函数的变量。答案就是函数闭包,或者函数内嵌套函数。
如第一个例子可以改成:
function test(){ ( function(){ for(var i=0;i<3;i++){ var j=5; } } )(); alert(i); alert(j); } test();
这样i j这两个变量就不会污染函数了。