1 <script> 2 var i=10; //全局变量 3 j = 20; //全局变量 4 5 function(){ 6 var i=30; //局部变量 7 h = 40; //全局变量 8 } 9 </script>
由此可以总结一句话,在函数内部定义的就是局部变量,否则就是全局变量。
1 <script> 2 var i =10; 3 function display(){ 4 //var i = 20;//局部变量只在局部作用域起作用 5 i= 30; //全局的,会将i的值修改为30 6 } 7 alert(i);//结果为10 30 8 </script>
在函数内的变量没有var 声明,则会直接影响全局变量。
为什么没有var的变量是全局的?
是因为,在js中,如果在某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,则调用;如果没有找到,继续向上查找,一直查找到全局作用域为止,如果全局作用域仍然没有这个变量的声明语句,那么就会自动在全局作用域中进行声明,这个就是js中的作用域链。
1 <script> 2 window.onload = function display(){ 3 i= 30; 4 } 5 alert(i); 6 </script>
弹出的结果就是30
再看这个例子:
1 <script> 2 var i = 10; 3 function fn1(){ 4 i=100; 5 function fn2(){ 6 i=1000; 7 function fn3(){ 8 i=10000; 9 } 10 fn3(); 11 } 12 fn2(); 13 } 14 fn1(); 15 alert(i); 16 </script>
执行的结果就是10000
如果现在把 fn1中的i值改成 var = 100;则弹出i的值为:10;
局部访问全局使用作用域链
全局访问局部可以使用闭包函数模拟