标签:
作用域由函数决定
说实话,javascript的作用域有点让我混,因为和我之前学习的C、c++、java、php的作用域不同
例如:
if (true) { var msg = ‘msg‘; } console.log(msg); // 输出 msg;
js中会输出msg,而如果换做其他语言,估计会出现undefined的错误
原因是,javascript的作用域完全是由函数来决定的,if、for语句中的花括号不是独立的作用域
作用域变量引用顺序
<!DOCTYPE html> <html> <head> <script> var msg = "global"; var func = function(){ alert(msg); } func(); </script> </head> <body> </body> </html>
->输出结果“global”
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <script> 5 var msg = "global"; 6 var func = function(){ 7 var msg = "inner"; 8 alert(msg); 9 } 10 func(); 11 </script> 12 </head> 13 <body> 14 </body> 15 </html>
->"inner"
JavaScript的函数定义是可以嵌套的,每一层是一个作用域,变量搜索顺序是从内到外,按照作用域搜索顺序,在func函数访问msg变量时,首先在func函数作用域查找该变量,若未找到该变量,在从上一级作用域查找,直到查找到全局变量为止
变量声明默认提前
javascript中的所用变量声明都会被自动提前
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <script> 5 var msg = "global"; 6 var func = function(){ 7 alert(msg); 8 var msg = "inner"; 9 } 10 func(); 11 </script> 12 </head> 13 <body> 14 </body> 15 </html>
->显示undefined
因为该代码等价于下面的代码:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <script> 5 var msg = "global"; 6 var func = function(){ 7 var msg; 8 alert(msg); 9 msg= "inner"; 10 } 11 func(); 12 </script> 13 </head> 14 <body> 15 </body> 16 </html>
作用域的嵌套关系是定义时决定的而不是调用时决定的
1 var scope = ‘global‘; 2 var f6 = function() { 3 console.log(scope); 4 } 5 var f7 = function() { 6 var scope = ‘f7‘; 7 f6(); 8 } 9 f7(); // 输出 global
所有未定义的变量直接赋值,声明为全局变量
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <script> 5 var msg = "global"; 6 var func = function(){ 7 ms1 = "我默认声明为全局变量"; 8 } 9 func(); 10 alert(ms1);//"我默认声明为全局变量"; 11 </script> 12 </head> 13 <body> 14 </body> 15 </html>
作用域链,请查看链接:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html
标签:
原文地址:http://www.cnblogs.com/smart-tian/p/4620872.html