js作用域

---恢复内容开始---

/*作用域
   在js中,函数嵌套是非常普遍的,首先在函数内部寻找,寻找不到就会到函数外层寻找……直到window*/
      var c=5;
      function t1(){
          var d=6;
      
      function t2(){
          var e=7;
          alert(c+d+e);
      }
      t2();
  }
  t1();//18

 /*声明变量var的作用  var实在函数运行的上下文中,声明一个变量,如果不加var则仅仅理解为一个赋值操作,不要狭隘的理解为一个全局变量*/
     alert(window.d); //undefined
     alert(window.e);//undefined
     function t(){
         d=5;
         var e=6;
     }
     t();//d没有加var仅仅是一个赋值操作,寻找t域内的函数,没找到,继续寻找……window,window.d=5
     alert(window.d);//5
     alert(window.e);//undefined

function t1(){
       var d;
       function t2(){
           d=5;
           e=6;
       }
       t2();
   }
   t1();
   console.log(d);//d is not defined错误

   console.log(window.d);//undefined
   console.log(e);//6

var str1="global";
   function t1(){
       console.log(str1);
       console.log(str2);
        str2="local";
   }
   t1();
第一行执行,在t1内寻找str1,没有,又在window上寻找str1,有,打印str1
第二行执行,在t1内寻找str2,  没有,又在window上寻找str2,没有,因此是str2 is not defined
第四行执行,(实际出错,没有执行到这一行),才把全局的str2赋上值

var str1="global";
   function t1(){
       console.log(str1);
       console.log(str2);
       var str2="local";
   }
   t1();

第一行执行,在t1内寻找str1,没有,又在window上寻找str1,有,打印str1
第二行执行,在t1内寻找str2,  没有,又在window上寻找str2,没有,因此是undefined
第四行执行,(实际出错,没有执行到这一行),才把全局的str2赋上值

js代码自上而下执行,但是js代码在整体运行前分:词法分析期和运行期

自上而下执行之前,先有一个词法分析过程,以上面为例:

1:分析t1函数

t1(){

var str2; //分析出t1内有str2局部变量,注意此时函数未执行,因此str2的值是undefined

}

2:执行t1函数

       console.log(str1);//global
       console.log(str2);//undefined
       var str2="local";//local

原文地址:https://www.cnblogs.com/autismtune/p/5177295.html