如何理解JS中的作用域与作用域链?

本文介绍了JavaScript中的作用域概念,包括全局作用域与局部作用域的区别,并探讨了如何利用作用域链进行性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.背景介绍

什么是作用域呢,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript的中,变量的作用域有全局作用域和局部作用域两种。

2.知识剖析

1.全局作用域(Global Scope)在代码中任何地方都能访问到的对象拥有全局作用域,一般来说一下几种情形拥有全局作用域:

(1)在函数外面定义的变量拥有全局作用域,例如:

var a =“全局变量”;

function tion(){

的console.log(a)的

}

重刑();

(2)所有末定义直接赋值的变量自动声明为拥有全局作用域,例如:

function tion(){

var a =“变量”;

B = “全局变量”;

的console.log(a)的

}

灰(); //变量

的console.log(B); //全局变量

的console.log(一); //脚本错误

变量b拥有全局作用域,而一个在函数外部无法访问到。

(3)所有窗口对象的属性拥有全局作用域

一般情况下,窗口对象的内置属性都都拥有全局作用域,例如window.name,window.top等等。

var a ='baidu.com';

function text(){

的console.log(this.a);

}

text(); //'baidu.com'

window.text(); //'baidu.com'

console.log(window.a); //'baidu.com'

在上面示例中,一个变量和文本()函数方法没有指定上级对象,所在二者会被添加到窗口全局对象,所以直接访问二者与通过窗口访问本质相同(如,直接访问文本()与使用window.text()访问一样)。

3.常见问题

如何更加直观的体现作用域链

4.扩展思考

如何运用作用域链的知识进行性能优化

其实作用域链就是JS引擎查询数据的一个链表,后定义的覆盖先定义的,查询不到定义的数据就往深一层查询,一直到全局作用域为止但是越往内层延伸,读写速度就会越慢,查找全局变量是最慢的。所以,在编写代码的时候应尽量少使用全局变量,尽可能使用局部变量。如果一个跨作用域的对象被引用了一次以上,则先把它。存储到局部变量里再使用例如下面的代码: 

function changeColor(){

的document.getElementById( “A”)。的onclick =函数(){

。的document.getElementById( “B”)style.backgroundColor = “红色”;

。的document.getElementById( “A”)style.backgroundColor = “红色”; };

}

。这个函数引用了两次全局变量文件,查找该变量必须遍历整个作用域链,直到最后在全局对象中才能找到这段代码可以重写如下: 

function changeColor(){

var a = document.getElementById(“a”);

var b = document.getElementById(“b”)

a.onclick =函数(){

a.style.backgroundColor = “红”;

b.style.backgroundColor = “红”;

}; 这段代码比较简单,但是如果程序中有大量的全局变量被从新反复访问,那么重写后的代码性能会有显着改善。

5.参考文献

参考:  JavaScript开发进阶:理解JavaScript作用域和作用域链

6.更多讨论

1.曾经有人提到全局作用域污染,这个意思是要少用全局变量吗?

意思是作用域链就是JS引擎查询数据的一个链表,后定义的覆盖先定义的,查询不到定义的数据就往深一层查询,一直到全局作用域为止但是越往内层延伸,读写速度就会越慢,查找全局变量是最慢的。所以,在编写代码的时候应尽量少使用全局变量,尽可能使用局部变量。如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。

 

2.局部变量和全局变量谁的优先级高?

回答局部变量,因为查询的时候一一级一级的从局部到全局。

 

3.闭包的实现原理是不是就是通过作用域链的原理?

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值