JavaScript——变量作用域

在JavaScript中,var定义变量实际是有作用域的。

假设在函数中声明,则在函数体外不可以使用~    (硬要实现可以使用  闭包 ) 

1  function qwe(){
2       var x=1;
3       x = x+1;
4   }
5   x = x+2;     //报错输出  Uncaught ReferenceError:x is not defined

 

如果两个函数使用了相同的变量名,只要在函数内部就不冲突!

1 function qwe(){
2       var x=1;
3       x = x+1;
4   }
5 
6   function qwe2(){
7       var x=1;
8       x = x+1;
9   }

 

内部函数可以访问外部函数的成员,反之则不行

 1 function qwe(){
 2       var x=1;
 3 
 4       //内部函数可以访问外部函数成员,反之则不行!
 5        function qwe2(){
 6            var y=x+1;     //  2
 7        }
 8 
 9        var z = y+1;     // 报错 Uncaught ReferenceError:x is not defined
10   }

 

假设,内部函数变量和外部函数变量重名!

 1 function qwe(){
 2       var x=1;
 3 
 4       //内部函数可以访问外部函数成员,反之则不行!
 5        function qwe2(){
 6            var x=2;
 7            console.log('inner'+x);   //输出outer1
 8        }
 9        console.log('outer'+x);       //输出inner2
10        qwe2()
11   }
12   qwe()

假设在JavaScript中函数查找变量从自身函数开始~,由“内”向“外”查找,假设外部存在这个同名的函数变

量,则内部函数会屏蔽外部函数的变量。

 

   提升变量作用域

1 function qwe(){
2       var x="x"+y;
3       console.log(x);
4       var y='y';
5   }
6   qwe()

结果为:xundefined

说明:js执行引擎,自动提升了y的声明,但不会提升变量y的赋值;

1 function qwe2(){
2       var y;
3       
4       var x="x"+y;
5       console.log(x);
6       y='y';
7   }

这个是在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱放,

便于代码维护!

1 function qwe2(){
2       var x=1,
3           y=x+1,
4           z,i,a;    //undefined
5           
6       //之后随意使用
7   }

 

   全局函数

1  //全局变量
2    x = 1;
3 
4    function f(){
5        console.log(x);
6    }
7    f()
8    console.log(x);

全局对象window

1 var x='哈哈';
2    alert(x);
3    alert(window.x);   //默认所有的全局变量,都会自动绑定在window下;

alert()这个函数本身也是一个 window 变量 ;

 1    var x='xxx';
 2    window.alert(x);      //xxx
 3 
 4    var old_alert=window.alert;
 5    old_alert(x);         //xxx
 6 
 7    window.alert=function(){
 8 
 9    };
10    //发现alert()无效
11    window.alert(123);
12 
13    //恢复
14    window.alert=old_alert;
15    window.alert(456);    //456

JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错:‘RefrenceError'   。

1 window.alert(x);

 

  规范

由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件使用了相同的全局变量,如何减少冲突  ?

1 //唯一全局变量
2    var clApp={};
3 
4    //定义全局变量
5    clApp.name='cl';
6    clApp.add=function(a,b){
7       return a+b;
8    }

 

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题

  jQuery  

 

  局部作用域  let

1 function aaa(){
2       for (var i=0;i<100;i++){
3           console.log(i);   //99
4       }
5       console.log(i+1);    //101
6    }
7 aaa()

ES6 let关键字,解决局部作用域冲突

1 function aaa(){
2       for (let i=0;i<100;i++){
3           console.log(i);   
4       }
5       console.log(i+1);      //Uncaught ReferenceRrror: i is not defined
6    }
7 aaa()

建议大家都是使用 let 去定义局部作用域的变量 !

 

 

   常量  const

在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量,建议不要修改这样的值

1   var PI='3.14';
2   console.log(PI);
3   PI='134';   //可以改变这个值
4   console.log(PI);

在ES6引入常量关键字  const   

1   const PI='3.14';//只读取变量,改变不了
2   console.log(PI);     //3.14.
3   PI='134';            //报错:TypeError: Assignment to constant variable.
4   console.log(PI);

 

posted @ 2021-05-10 19:17  cengxuyuan  阅读(77)  评论(0)    收藏  举报