全局作用域:整个script标签 或者是一个单独的js文件;
局部作用域:在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用;
注意: 全局作用域和局部作用域如果命名相同是不会相互影响的;
全局变量和局部变量
变量的作用域: 根据作用域的不同我们变量分为全局变量和局部变量
-
全局变量: 在全局作用域下声明的变量,在全局下都可以使用
-
局部变量: 在局部作用域下声明的变量,只能在函数内部使用
全部变量和局部变量练习题
1、
1 <script> 2 var a = 10; 3 function test() { 4 var b = 100; 5 console.log(a); 6 a=100; 7 } 8 test(); 9 console.log(a); 10 console.log(b); 11 </script>
1 <script> 2 var a = 1; 3 function test(a) { 4 a = 100; 5 console.log(a); 6 return a; 7 } 8 test(a); 9 //a = test(a); 10 console.log(a); 11 </script>
作用域链(函数嵌套中变量的使用)
定义:
内部函数访问外部函数的变量,采取的是链式查找的方式来决定哪个值;
访问变量的时候,某个作用域中没有该变量,就会依次向上访问上层作用域中的变量 ---- 也就是就近原则;
预解析
定义:
JS引擎会把当前作用域中的var和function提升到当前作用域的最前面执行;
分为变量预解析(变量提升)和函数预解析(函数提升)
变量预解析(变量提升)--- 只提升声明不提升赋值
把当前作用域中的声明变量提升到当前作用域最前面执行,但是只能提升声明,不能将赋值也提升;
数预解析(函数提升)---- 只提升声明不调用
把当前作用域中函数声明提升到当前作用域的最前面执行,但是不调用函数;
1 <script> 2 var a = 10; 3 function max(a) { 4 a = 100; //此处的a为局部变量 因为形参为局部变量 虽然传过来了实参 但是 局部变量形参又重新赋值了 5 b = 1000; //此处的b为函数内部全局变量 b=1000 6 console.log(a); //打印的是形参局部变量a=100 7 console.log(b); //打印的是函数内部的全局变量b=1000 8 return a; 9 } 10 var re = max(a); // 接受返回值a 又重新赋值给了re 11 console.log(re); //这个re打印的是 函数的返回值a 12 console.log(a); //这个a打印的是 全局变量最上面的a 13 console.log(b); //这个b打印的是 函数内部的全局变量b 14 </script>
1 // 变量提升练习题 2 var num = 1; 3 function demo() { 4 console.log(num); 5 function demoSon() { 6 num = 3; 7 } 8 var num = 2; 9 demoSon(); 10 } 11 demo();
//变量和函数提升后
1 /* var num; 2 function demo() { 3 var num; 4 function demoSon() { 5 num = 3; 6 } 7 console.log(num); //uedefined 8 num = 2; 9 demoSon(); 10 } 11 num = 1; 12 demo(); */
var a = 123; function fun(){ console.log(a);//123 a = 456; } fun(); console.log(a);//456
函数内部的 a 为全部变量 所以函数外面打印的a为函数内部的全局变量
函数内部的第一个打印a 函数内部没有 在函数外面的全局变量里找 找到了 全局变量a=123 所以打印123