代码改变世界

javascript 基础 --- let 和 var(词法作用域)

2019-06-11 15:31  *奋斗*  阅读(278)  评论(0)    收藏  举报

1)全局作用域下,被 let 声明的变量,不会作为全局对象 window 的属性,被 var 声明的变量,则自动为 window 对象的属性;
2)函数作用域下,两者的意义基本相同;
3)块作用域下,例如:let 在 for 循环用的话,只有 for 循环中可用;而用 var 声明变量,for 循环所在的整个函数可用;
4)var 允许在同一作用域中重复声明变量,但 let 只允许声明一次;
5)let 和 var 在指定作用域下,都会经历“变量提升”,但 var 声明的变量会默认设置为 undefined,但 let 声明的变量,并没有初始化,如果此时用到会报 ReferenceError 错误。从代码块开始到执行到let 变量初始化完毕这段时间,let 变量已经声明,但不可访问,这段时间被称为【暂存性死区】。

注意:javascript 里的函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行。

    var tt = 'aa';
    function test() {
      alert(tt);
      var tt = 'dd';
      alert(tt);
    }
    test(); // 弹出两个框:第一个 undefined,第二个 dd

 

    var value = 1;

    function foo() {
      alert(value); 
    }

    function bar() {
      var value = 2;
      foo();
    }

    bar();  //1,函数在哪里调用没有关系,变量的位置在编译的词法分析阶段就确定了。
    // 当调用foo时,会对value进行一次RHS查询,
    // 在当前函数作用域中没有查找到会查找到最外层的作用域,也就是全局作用域定义的value

 

个人统计【1】:2019-06-11