js作用域

  对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这两个变量就不会污染函数了。

原文地址:https://www.cnblogs.com/actionscr/p/4854330.html