End

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

posted @   白乾涛  阅读(5266)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示