js作用域一
  4Sc2EobNVfno 2023年11月22日 23 0

1. let与var:

①. let定义变量、const定义常量:
    a. const定义常量值不能修改,但是对象里面的属性是可以修改的.

②. 在同作用域中不能重复定义:
    a. js的作用域(scope)只有全局和局部.
    b. var可以后面覆盖前面的变量.

③. 块级作用域生效:
    a. let支持块级作用域,花括号就能为它创建新的作用域.

④. 不存在变量提升:

⑤. 区别:
    a. es5声明变量只有2种方式:var和function.
    b. es6声明变量有let、const、import、class,再加上es5的var、function,一共6种.
    c. 浏览器顶层对象是window,Node顶层对象是Global.
    d. 全局变量:
       (1). es5的顶层对象等价于全局变量.
       (2). es6中:
            1. var、function声明的全局变量,仍然属于顶级对象的属性.
            2. let、const、class声明的全局变量不再属于顶层对象的属性.
            3. 说明es6开始,全局变量和顶层对象的属性开始分离、脱钩.

(1). var提升在哪里去了?

①. var声明的全局变量:
    a. 会被绑定到Window对象.

②. let/const声明的全局变量:
    a. 会被绑定到Script对象,而不是Window对象(不能以Window.xx的形式使用).

③. var/let/const声明的局部变量,都会被绑定到Local对象.

④. Script对象、Window对象、Local对象三者是平行并列关系.

(2). 验证:

①. let num = 1
    console.log(this.num)   // undefined
    console.log(this)       // Window对象中没有num属性

    var num2 = 2
    console.log(this.num2)	// 2
    console.log(this)	    // Window有num2属性

②. 如图1:
    let aaa = 111;	        // Script
    const aab = 111;	    // Script
    var aac = 111;	        // Window,即Global
    function fn() {
      let aad = 111;	    // Local
      const aae = 111;	    // Local
      var aaf = 111;        // Local
      debugger
    }
    fn();

③. 如图2:
    let aaa = 111;	        // Script
    const aab = 111;	    // Script
    var aac = 111;	        // Window
    let obj = {
        uu: function() {
          let aag = 111;
          const aah = 111;
          var aai = 111;
          debugger
        }
    }
    obj.uu()

④. 两张图可以看出,局部变量被绑定到Local对象上,与调用者即this指向无关.

(3). 验证2:

let aaa = 111;	        // Script
const aab = 111;	    // Script
var aac = 111;	        // Window,即Global
function fn() {
  let aad = 111;	    // Local
  const aae = 111;	    // Local
  var aaf = 111;        // Local
}
console.dir(fn)

①. 作用域链[[Scopes]]数组有两个值:Script、Global.

②. Script保存let、const定义的全局变量aaa、aab,跟window不一样.

③. Global保存了var定义的全局变量aac.
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: 安装包 R语言 下一篇: graphql-php
  1. 分享:
最后一次编辑于 2023年11月22日 0

暂无评论

推荐阅读
4Sc2EobNVfno
作者其他文章 更多