js运行时内置了一个Global对象。
这个Global对象跟运行环境有关。在浏览器运行环境中。Global就是window对象。
在nodejs中。Global对象是global对象。
当你在浏览器环境中,直接使用一个未经定义的变量,
例如foo=123;那么foo这个变量自动声明为全局变量。变量引用自动挂载到了Global对象,即window对象上,使用上等同于全局对象的属性,你可以试试来验证。
如:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> var a=3; console.log(window.a); //3 </script> </body> </html>
在全局对象下定义的函数体里,不用var声明的变量,首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用域etc。。。)中解析 该变量; 如果在任何当前作用域链中找到该变量,则会执行对该变量赋值; 如果没有找到该变量,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中定义该变量为全局变量并赋值。
测试代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> function test(){ var a1=3; a2=4; } console.log(window.a1); //undefined console.log(window.a2); //4 </script> </body> </html>
所以建议各位在fn里要记住定义局部变量要var,全局变量不要var(要注意作用域链中不存在同名变量)。