JavaScript let 和 var 作用域 声明提升
JavaScript let 和 var 作用域 声明提升
基本规则
- 使用 var 在函数外声明的变量是全局变量,在函数内声明的变量是局部变量
- 使用 var 声明的变量不具备块级作用域的特性,因此在
{}
外依然能被访问到 - 使用 let 声明的变量只在其所在的 代码块{} 内有效,具备块级作用域的特性
- 使用 const 声明的是只读常量,一旦声明,值就不能再改变
- 使用 var 定义的变量可以在使用后声明,也就是变量可以先使用再声明
- 使用 let 定义的变量不可以在使用后声明,也就是变量需要先声明再使用
console.log(xx) // 使用 var 定义的变量可以在使用后声明,也就是变量可以先使用再声明
var xx
console.log(yy) // ReferenceError: Cannot access 'yy' before initialization
let yy
补充规则
- 在函数体内使用 var 和 let 关键字声明的变量,都是 局部的
- 在函数体外及代码块外使用 var 和 let 关键字声明的变量都是 全局的
- 在 JavaScript 中, 全局作用域是针对 JavaScript 环境
- 在 HTML 中, 全局作用域是针对 window 对象
- 使用 var 声明的全局作用域变量属于 window 对象,可以使用
window.xxx
访问 - 使用 let 声明的全局作用域变量不属于 window 对象,不可以使用
window.xxx
访问
非严格模式下,给未声明变量赋值,该变量将被作为 window 的一个属性
myFunction()
console.log(carName); // 调用函数后,此处可访问 carName 变量
function myFunction() {
carName = "BMW";
}
重置变量
- 在相同的作用域或块级作用域中,不能使用 let 重置 var 声明的变量
- 在相同的作用域或块级作用域中,不能使用 let 重置 let 声明的变量
- 在相同的作用域或块级作用域中,不能使用 var 重置 let 声明的变量
var a = 2;
var x = 2;
let y = 2;
let z = 2;
var a = 3; // 合法,使用 var 声明的变量在任何地方都可以修改
let x = 3; // 不合法,不能使用 let 重置 var 声明的变量
let y = 3; // 不合法,不能使用 let 重置 let 声明的变量
var z = 3; // 不合法,不能使用 var 重置 let 声明的变量
将函数内的局部变量暴露给外部作用域
局部变量只能用于定义它函数的内部,对于其他的函数或脚本代码是不可用的。
全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值。
通常有三种方法,可将函数内的局部变量暴露给外部作用域:
- 通过全局对象:在函数内部,可以通过将局部变量赋值给 window 对象的属性来使其全局可访问。例如
window.a = a
。 - 定义全局变量:在函数内部,不使用 var、let 或 const 声明的变量,会被视为全局变量。但这种做法通常不推荐。
- 闭包:闭包允许内部函数访问外部函数的局部变量。即使外部函数执行完毕后,其局部变量仍然可以被内部函数引用。
声明提升
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以先使用再声明。
声明提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
只有声明部分会提升,初始化部分不会升。
JavaScript 严格模式(strict mode)不允许使用未声明的变量。
2017-08-15
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/7367830.html
分类:
01 新版 MarkDown
标签:
2017
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律