一、执行环境

我更喜欢称 执行环境作用域,每个函数都有自己的执行环境

我觉得基本的 作用域 肯定都知道,比如函数内不能访问函数外的变量(这里的变量指的是值变量),而非我之前在 http://www.ptbird.cn/javascript-func-args.html 中提到的通过对象不进行返回即可更改内容的方式。

印象中,我以前写js经常会创建好多的 "全局变量" ,来供大家共同使用或者是修改,当然这种方式肯定是不好的。

我对 作用域 只是有一个大概的了解,但是对于 javascript 的 作用域链 以及 搜索标示符 并不是特别的了解。

二、作用域链

《javascript高级程序设计》中对 作用域链的作用的解释是: 是保证对执行环境有权访问的所有变量和函数的有序访问

我对作用域链的理解是:

给 每一个不同的对象(这个对象的概念不是Object,包括function等等)提供一条可用标示符的搜索链,用来为每一个对象寻找需要的标示符。

举个例子:

    var lastName = "postbird";
    function getFullName(){
        var firstName = "ptbird";
        return firstName + " " +lastName;
    }
    console.log(getFullName());

函数 getFullName() 调用的时候(在环境中执行),需要寻找变量标示符,从而能够拿到需要的值,而这个顺序自然是从最近往最外查找

  • 首先寻找 firstName ,从前往后(从里往外),在函数体内发现了局部变量 firstName,寻找结束。
  • 在函数体内没有发现 lastName ,因此会沿着作用域链继续向后(外)寻找,在全局变量(window)的作用域下发现了 lastName ,从而得到 lastName 的值,寻找结束。

作用域链产生的时间?

《javascript高级程序设计》中指出:当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。

作用域链搜索过程?

搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直至找到标识符为止(如果找不到标识符,通常会导致错误发生)。

4-1.jpg

(图片来自《javascript高级程序设计》)