首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我的JavaScript学习笔记:作用域链

我们知道在ECMAScript中,作用域分为全局作用域和函数作用域以及块作用域。任何位置的代码都可以访问全局作用域中变量,但是函数作用外部的代码不能访问函数作用域的变量,快作用域也是如此。注意。这里我们说明一点,使用var没有块作用域的。

let globalVar=“这是全局作用域!”//全局作用域

function fn(){

let localVar="这是局部作用域!";//局部作用域

}

for(let i=0;i

let blockVar="这是块作用域";

}

console.log(globalVar);//这是全局作用域

console.log(localVar);//index.html:21 Uncaught ReferenceError: localVar is not defined,JavaScript抛出错误停止解析

console.log(blockVar);//index.html:21 Uncaught ReferenceError: blockVar is not defined

在上面的代码中,我们分别在全局作用域和局部作用域以及块作用域中定义了三个变量,然后在全局作用域中访问这个三个变量。我们只能访问全局变量globalVar。

注意,注意根据JavaScript引擎的解析顺序,你能不会得到这个解析错误:

console.log(blockVar);//index.html:21 Uncaught ReferenceError: blockVar is not defined。

这是因为JavaScript解析到console.log(localVar)时抛出错误后就会停止解析后面的代码。我们将console.log(localVar)和console.log(blockVar)互换位置就可以了。

如果我们在局函数作用中访问全局作用域和函数作用域以及块作用域中定义了三个变量:

let globalVar = "这是全局作用域!";//全局作用域

function fn() {

let localVar = "这是局部作用域!";//局部作用域

console.log(globalVar);//这是全局作用域

console.log(localVar);//这是局部作用域!

console.log(blockVar);//index.html:18 Uncaught ReferenceError: blockVar is not defined

}

for (let i = 0; i < 3; i++) {

let blockVar = "这是块作用域";

}

fn();

由上面的代码可知,在函数作用域中可以访问全局变量和该函数中定义的变量,但是不能访问块作用域中的变量。

let globalVar = "这是全局作用域!";//全局作用域

function fn() {

let localVar = "这是局部作用域!";//局部作用域

}

for (let i = 0; i < 1; i++) {

let blockVar = "这是块作用域";

console.log(globalVar);//这是全局作用域

console.log(blockVar);//这是块作用域

console.log(localVar);//Uncaught ReferenceError: localVar is not defined

}

fn();

那么如果我们函数套函数,在最里层的函数中访问在嵌套函数和全局环境中定义的变量是否能够正确访问?答案是可以的

let color = "blue";

function changeColor() {

let anotherColor = "red";

function swapColors() {

let tempColor = anotherColor;

anotherColor = color;

color = tempColor;

// 这里可以访问 color、anotherColor 和 tempColor

}

// 这里可以访问 color 和 anotherColor,但不能访问 tempColor

swapColors();

}

// 这里只能访问 color

changeColor();

上面的代码中,swapColors()中的变量能够访问changeColor()中的变量和全局环境中的变量。因为swapColors()函数是changeColor()的局部环境。但是changeColor()函数环境中的变量不能访问swapColors()函数中的变量。同理changeColor()函数环境中的变量能够访问全局环境中的变量,而全局环境中的变量不能访问changeColor()函数环境中的变量。所以这就由里(局部环境)向外(全局环境)形成了一条访问链条,这就是作用域链:

作用域链

所以作用域链的访问顺序是由里向外,有局部到全局

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200726A012FD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券