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

JavaScript 声明、声明提升 #1

Open
afishhhhh opened this issue Oct 17, 2018 · 2 comments
Open

JavaScript 声明、声明提升 #1

afishhhhh opened this issue Oct 17, 2018 · 2 comments
Labels

Comments

@afishhhhh
Copy link
Owner

afishhhhh commented Oct 17, 2018

1. 声明

JS 中有3种声明方式:varlet 以及 const

var

var 变量声明的作用域是当前的执行环境,函数或者全局,不具有块级作用域。

letconst

letconst 都具有块级作用域,前者用于变量,后者用于常量。

在全局作用域,var 声明的变量会成为 window 的一个属性,letconst 则不会。

已声明变量和未声明变量

  • 已声明变量总是被绑定在当前的作用域,函数或者全局;,未声明变量总是全局的(成为 window 的一个属性)。
  • 已声明变量在执行代码前就已经被创建,未声明变量直到赋值时才被创建。
  • 已声明变量是不可配置的(configurable: false),未声明变量是可配置的(configurable: true)。
var varname1 = 'varname1'
varname2 = 'varname2'
Object.getOwnPropertyDescriptor(window, 'varname1')
Object.getOwnPropertyDescriptor(window, 'varname2')
@afishhhhh afishhhhh added the JavaScript language label Oct 17, 2018
@afishhhhh
Copy link
Owner Author

2. 声明提升

varletconst 以及 function 声明无论发生在哪里,都会在执行代码之前被处理,也就是声明提升,声明被提升至当前作用域的顶部。

2.1 var hoisting

console.log(varname) // undefined
var varname = 'someValue'

以上代码等价于

var varname
console.log(varname)
varname = 'someValue'

var 声明提升之后,varname 会被初始化为 undefined,所以 console.log(varname) 会打印出 undefined,直到代码执行至 varname 的赋值语句。

2.2 let hoisting

  • let 也会发生声明提升,与 var 不同的是,前者不会在提升之后初始化,直至初始化语句被执行时才能被正确访问到。
  • 块开始的地方直到变量被初始化,该变量处在暂存死区(Temporal Dead Zone)之中。

暂存死区同样适用于 const

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant