js中的变量声明问题

js中的变量声明

var 声明变量

函数内部声明变量

/**
 * QQ群:976961880
 * 函数内部声明变量,未使用var声明,那么变量会成为全局变量
 * 函数执行之后,message1会成为全局变量
 */
function test1() {
    message1 = '跃码教育'
}
test1()
console.log(message1) //跃码教育
复制代码

ps:错误示例

函数内部未使用var声明

function test1() {
    message1 = '跃码教育'
}
// 函数内部声明变量,未使用var声明,那么变量会成为全局变量
// 函数执行之后,message1会成为全局变量
test1()
console.log(message1) //跃码教育
复制代码

函数内部先使用,后用var声明

function test2() {
    console.log(auth)
    var auth = '跃码教育'
}
// 在函数内部通过关键字var声明的变量会提升到函数作用域顶部
// test2和test3等价
test2() //undefined
复制代码

等价示例

function test3() {
    var auth
    console.log(auth)
    auth = '跃码教育'
}
// test2和test3等价
test3() //undefined
复制代码

let 声明变量

错误示例

if (true) {
    let title = '跃码教育-js变量作用范围'
}
console.log(title) //Uncaught ReferenceError: title is not defined

复制代码

暂时性死区

let 与 var 的另一个重要的区别,就是 let 声明的变量不会在作用域中被提升。

在解析代码时, JavaScript 引擎也会注意出现在块后面的 let 声明,只不过在此之前不能以任何方

式来引用未声明的变量。在 let 声明之前的执行瞬间被称为“暂时性死区”( temporal dead zone),在此

阶段引用任何后面才声明的变量都会抛出 ReferenceError

全局声明

与 var 关键字不同,使用 let 在全局作用域中声明的变量不会成为 window 对象的属性( var 声明的变量则会)

var auth = '跃码教育'
console.log(window.auth) //教育
let auth2 = '跃码教育'
console.log(window.auth1) //undefined

复制代码

经典问题

for (var i = 0; i < 5; ++i) {

  setTimeout(() => console.log(i), 0)

}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享