Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

var;let;const #2

Open
shen774411223d opened this issue Feb 10, 2021 · 0 comments
Open

var;let;const #2

shen774411223d opened this issue Feb 10, 2021 · 0 comments

Comments

@shen774411223d
Copy link
Owner

shen774411223d commented Feb 10, 2021

三者都是js中定义变量的关键字。其中 let;const是es6中新增的方式

在变量定义时有三个阶段:变量标识符的创建;变量的初始化;变量的赋值

  • var

    使用var来定义变量在es6之前是唯一的办法。但是var也有一些弊端

    从js设计时开始,浏览器内的顶层对象就等于window。这就诞生了一个问题: 全局的执行上下文就是 顶层对象(window)。所以在全局使用 var来定义变量时 就是在window上添加属性。在es6之后,开发者为了解决这一问题。引入了 let;const

    var会存在变量提升。在ECMA对此的描述时(看过文档后的口述):代码编译阶段时会把执行上下文里所有使用var声明的变量全部做以下处理:

    当你创建了一个变量,变量标识符初始化后,如果没有为此赋值,var会将该变量初始化undefined。如果有赋值,var会先将该变量初始化为undefined,随后在赋值给正确的值

有两种情况。第一种:只声明变量,不赋值。🌰:

// var a
var a
a = undefined

第二种:声明变量和赋值。🌰:

// var a = 10 
var a
a = undefined
a = 10
  • let

    let 相比于var 它不会在window内出现,也就是不挂载到全局的执行上下文内。let;const会创建在块级作用域里,存在暂时性死区。也就是声明之前不可访问

    let定义变量的过程和var是差不多的。差别在于:代码编译阶段只做了 变量标识符的创建。变量的初始化;变量的赋值这两步放在了赋值阶段在执行

  • const

    const和上面的let规则一样,但是const必须要有初始值,而且同一变量只能声明一次

    // ok ✅
    let num
    
    // error ❌
    const num
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant