js作用域总结

一、在ES5中,js 的作用域

      js作用域,只有全局作用域与函数作用域,没有块级作用域。

    1、全局作用域

  

var a = 10;
function aaa() {
alert(a) }
function bbb(){ var a=20; aaa() } bbb(); // 10

   a =10 是全局的  而a=20 是局部的

 

 2、变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。

   

var a=10
function aaa(){
     alert(a);
    var a=20
}
 
aaa();   // undefined,一是预解析,二是就近查找。

   

var a = 10
 function aaa(){
   alert(a)
    a=20
}
  aaa();  // 10

  这个虽然是就近原则,但是就近找var声明的变量,因为a= 20  没有var声明,只是修改了a 的值,所以到外面去找了,输出的是10。不过没错的是a=20后,a确实为20了,只不过alert的时候还没有执行到那~~

 

var a = 10
 function aaa(){
    a=20
   alert(a)
}
  aaa();  // 20

 

3、全局作用域与函数作用域:

var a=10
 function aaa(){
     bbb();
     alert(a);
    function bbb(){
       var a=20
  } 
}
   aaa();  // 10

 

 

4、当参数跟局部变量重名时,优先级是等同的。

       

var a=10;
 function aaa(a){
    alert(a)
    var a= 20;
}
 aaa(a)   // 10

 

   js 中传参时,基本类型传值,引用类型传引用。

 

 var a = 5;
 var b=a;
 b +=3
  alert(a); // 5

var a = [1,2,3]
var b=a;
b = [1,2,3,4];
alert(a); //[1,2,3]

var a = [1,2,3] var b=a; b.push(4); alert(a); //[1,2,3,4]

 

参数与变量一样也是有作用域:

var a=10;
function aaa(a){
   a +=3
}
aaa(a)
alert(a) // 10




var a=10;
function aaa(a){
   a +=3
alert(a)
}
aaa(a)
 // 13


 

var a= [1,2,3]
  function aaa(a){
     a=[1,2,3,4]
}
aaa(a)
alert(a)  // 1,2,3



var a= [1,2,3]
  function aaa(a){
     a.push(4)
}
aaa(a)
alert(a)  // 1,2,3,4
 

 

   二、es6 中,块级作用域

          块作用域由{ }包括,if语句和for语句里面的{ }也属于块作用域。

           1、块作用域,var的变量外部是可以访问的。

     

{
    var a= 1;
     console.log(a)   // 1
}

console.log (a) // 1



( function A() {
     var b=2;
     console.log(b)  // 2
}) ();

 console.log(b); //报错


iftrue){
     var c=3
}

console.log(c) // 3

 

        2、 var 、 let 、 const 区别

            var定义的变量,没有块的概念,可以垮块访问,不能跨函数访问;

            let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问;

            const 用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。

            

<script type="text/javascript">
    // 块作用域
    {
        var a = 1;
        let b = 2;
        const c = 3;
        // c = 4; // 报错
        var aa;
        let bb;
        // const cc; // 报错
        console.log(a); // 1
        console.log(b); // 2
        console.log(c); // 3
        console.log(aa); // undefined
        console.log(bb); // undefined
    }
    console.log(a); // 1
    // console.log(b); // 报错
    // console.log(c); // 报错

    // 函数作用域
    (function A() {
        var d = 5;
        let e = 6;
        const f = 7;
        console.log(d); // 5
        console.log(e); // 6  (在同一个{ }中,也属于同一个块,可以正常访问到)
        console.log(f); // 7  (在同一个{ }中,也属于同一个块,可以正常访问到)

    })();
    // console.log(d); // 报错
    // console.log(e); // 报错
    // console.log(f); // 报错
</script>

 

posted @ 2018-07-19 17:40  雪昀  阅读(1122)  评论(0编辑  收藏  举报