Javascript关于作用域和作用域链

[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的性能差异会非常大。

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

猜你喜欢

转载自blog.csdn.net/qq_37728271/article/details/84023164