js的作用域和作用域链

278 阅读2分钟

1.作用域

  在 Javascript 中,作用域分为 全局作用域 和 函数作用域

全局作用域:

 代码在程序的任何地方都能被访问
 备注:window 对象的内置属性都拥有全局作用域。

函数作用域:

 在固定的代码片段才能被访问

1.1 作用域-上下级

作用域有上下级关系,上下级关系的确定就看函数在哪个作用域下创建的

例子说明一下

image.png

如图:fn作用域下创建了bar函数,那么“fn作用域”就是“bar作用域”的上级;

1.2 作用域-用处

作用域最大的用处就是隔离变量,不同的作用域下同名变量不会冲突。

变量取值: 到创建这个变量的函数 的作用域 中去变量;

2. 作用域链

2.1 定义

一般情况下,变量取值到 创建 这个变量的函数 的作用域中取值。

但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。

举个例子

var x = 10;

function fn(){
    console.log(x);
}

function show(f){
    var x = 20;
    f(); 
}

show(fn);

答案
10

解释:
》因为fn函数内部作用域没有创建x,就是去fn函数上级获取变量;
》fn函数常见在window, fn函数上级获取变量,即获取到var x = 10;
》所以当window调用 show()函数的时候,指向的是window, 因此show函数中f()指的是外部定义的function fu(){};
》所以最终输出 10

3. 总结:

1. 上下级关系的确定就看函数在哪个作用域下创建的;

2.一般情况下,变量取值到 创建 这个变量的函数 的作用域中取值; 
    关键字:到创建这个变量的函数 的作用域  中取值
    
3.如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域;
    关键字:会向上级作用域查找,一层一层到全局作用域;
 

在看一个例子

var a = 10;
function fn() {
    var b = 20;
    
    function bar() {
        console.log(a+b)
    }
    
    return bar;
}
var x = fn(),
    b = 200;

x()

答案:
30

画图解释变量取值:

image.png

这个函数是不是看起来很熟悉,不用怀疑,就是后面一个JavaScript重要知识点--闭包;