Javascript关于作用域和作用域链

本文介绍了JavaScript中函数作用域的内部属性scope及其作用,执行环境与执行上下文的概念,以及作用域链的工作原理。强调了在函数执行过程中,如何查找标识符并在作用域链中进行查找,同时提出了避免跨作用域查找以提高性能的建议。

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

[Scope]:

Javascript引擎中有一个scope的内部属性,这个scope对象包含了函数可以访问的作用域对象的集合,并且这个scope属性只能被浏览器所访问。scope属性是函数创建就存在的。

function ShowTime(time){

    var time=time;

    function logTime(){

        console.log("it's a new time");

    }
}
var showtime=new ShowTime('2012');
console.log(showtime);

当一个函数被创建,这个函数的作用域链中会插入一个对象,这个对象指向了全局对象,即所有在全局范围内定义的变量比如(window,document)

执行环境(执行上下文)

当函数执行时,会创建一个执行环境的对象(与scope是两个概念)。函数每次执行的执行环境都不一样。当函数执行完毕,执行环境被销毁。

执行环境对象也有自己的作用域,当执行环境创建时,其作用域链初始化为scope中的对象。这些值(包括了局部变量,参数集合等)被复制到执行环境的作用域链中,当这个过程完成,一个"活动对象"就创建好了,随后这个对象被推入函数作用域链的顶端。当执行对象被销毁,这个活动对象也会被销毁。

funciton showtime(time){

     var time=time;

}

showTime(2012)

作用域和作用域链

当一个函数执行时,会解析所使用的标识符,而这些标识符就会在作用域链中进行查找。如果在当前作用域中并未找到,就会到下一个作用域对象中进行查找。这些作用域对象的集合形成了作用域链。

在变量的使用中,应当避免跨作用域查找标识符。因为跨作用域查找标识符会造成性能消耗。

比如:

在执行showtime(2012)函数中(time为函数内部定义的变量),活动对象处于作用域链顶端,全局变量处于第二索引,因此使用time和document的性能差异会非常大。

因此建议如果需要反复操作全局变量时,将全局变量的值赋给一个局部变量,能大大减少性能开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值