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