5分钟看懂JavaScript变量提升

5分钟看懂JavaScript变量提升

一、变量提升

在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。

(1) 创建函数有两种形式,一种是函数声明,另外一种是函数字面量,只有函数声明才有变量提升

console.log(a) // f a() {console.log(a)}
console.log(b) //undefined
function a() {
  console.log(a) 
}
var b = function(){
  console.log(b)
}

相当于

var a = 'function'
var b
console.log(a)
console.log(b)

(2)变量提升

console.log(c) //undefined
var c = "第一次没打印出来,第二次才出来"
console.log(c) //第一次没打印出来,第二次才出来
function fn(){
  console.log(d) //undefined
  var d = '和前面的一样啊'
  console.log(d); //和前面的一样啊
}
fn()

其实,就相当于

var c
console.log(c)
c = "xxxx"
console.log(c)

二、函数提升与变量提升的优先级

console.log(a) // f a() {console.log(10)}
console.log(a()) // undefined
var a = 3
function a() {
  console.log(10) //10
}
console.log(a) //3
a = 6
console.log(a()) //a is not a function

原理 :

 var a = funtion () {
  console.log(10)
 }
 var a
 console.log(a) // f a() {console.log(10)}
 console.log(a()) // undefined
 a = 3
 console.log(a) //3
 a = 6
 console.log(a()) //a() is not a function

由此可见函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。

转自:https://www.cnblogs.com/oxiaojiano/p/7918967.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据