JavaScript作用域
在JavaScript中,作用域控制着变量和函数的可见性和生命周期。作用域是定义变量、函数以及访问它们的地方的一套规则。
作用域分为全局作用域和局部作用域。在函数中定义的变量、函数参数以及函数内部声明的函数都属于该函数的局部作用域。全局作用域包含了浏览器环境下的所有对象和方法,函数内部可以访问全局变量。
JavaScript作用域规则:
1.全局变量可以在整个程序范围内访问,函数内部可以访问全局变量
2.函数内部声明的变量只能在函数内部访问
3.函数内部可以访问全局变量
4.变量在出现在赋值表达式左侧时进行声明和初始化,赋值表达式右侧可以是任何类型
示例1:
var globalVar = 1; // 全局变量
function myFunc() {
var localVar = 2; // 局部变量
console.log(globalVar); // 可以访问全局变量
console.log(localVar); // 可以访问局部变量
}
myFunc(); // 函数运行
console.log(globalVar); // 可以访问全局变量
console.log(localVar); // 局部变量无法在函数外部访问
示例2:嵌套函数
function outer() {
var a = 1;
function inner() {
var b = 2;
console.log(a); // 可以访问外部函数的变量
}
inner(); // 调用内部函数
}
outer(); // 调用外部函数
块级作用域
JavaScript是ES6之前没有块级作用域的,只有全局作用域和函数作用域。而块级作用域类似于函数作用域,但是只存在于if语句、循环语句、try/catch语句以及ES6新增的let和const关键词中。
块级作用域规则:
1.变量和函数在块级作用域中声明时只存在于该块级作用域中,不会污染全局变量
2.块级作用域中存在变量提升,但需要注意使用let和const关键词
3.块级作用域在外部无法访问其中的变量
示例3:if语句块级作用域
var a = 1;
if (true) {
var a = 2;
}
console.log(a); // 2
使用var声明变量时,if语句中的a变量会覆盖全局变量a,导致输出结果为2。
示例4:let语句块级作用域
let b = 1;
if (true) {
let b = 2;
console.log(b); // 2
}
console.log(b); // 1
使用let声明变量时,if语句中的变量b只存在于该块级作用域中,不会影响全局变量b,输出结果为2和1。