深刻浅出:JavaScript做用域链

  1. 什么是做用域

任何程序设计语言都有做用域的概念,简单的说,做用域就是变量的做用范围。

  2. 变量的分类和变量做用域的分类

在JavaScript中,变量分为全局变量和局部变量,与此相对应的,变量的做用域有全局做用域和局部做用域两种。

  3. 全局变量和全局做用域

  在函数外声明的变量为全局变量,全局变量所对应的做用域为全局做用域。看以下代码:函数

var globalEle = "世界这么大";
function func(){
    console.log("函数内部:" + globalEle);
}
func();
console.log("函数外部:" + globalEle);

  打印结果:spa

  结果分析:设计

  在函数外部声明了一个变量globalEle,所以它为全局变量,拥有全局做用域,全局变量不管在函数内部仍是函数外部均可以被访问。3d

  4. 局部变量和局部做用域

  在函数内声明的变量为局部变量,局部变量所对应的做用域为局部做用域。看以下代码:code

function func(){
    var localEle = "而我在国内"
    console.log("函数内部:" + localEle);
}
func();
console.log("函数外部:" + localEle);

  打印结果:blog

  结果分析:ip

  在函数内部声明了一个变量localEle,所以它为局部变量,拥有局部做用域,局部变量只能在当前声明的函数内起做用,所以在函数外访问局部变量会提示not defined。作用域

  5. 什么是做用域链

  做用域链的创建过程此处不详细讲,一些官网定义的抽象的概念也很少加以阐述,就经过下面的例子来看一下,看以下代码:io

var ele = "函数外面定义的变量";
function func(){
    var ele = "函数func内定义的变量";
    function son(){
        var ele = "函数son内定义的变量";
        console.log(ele);
    }
    son();
}
func();

  打印结果:console

  结果分析:变量ele被定义了三次,但他们的做用域不一样,第一次定义的ele是全局变量,拥有全局做用域。第二次定义的ele是局部变量,在函数func内起做用,由于函数son是函数func的子函数,因此在函数son内也能够访问到这里定义的变量。第三次定义的ele也是局部变量,在函数son内部起做用。因此,在函数son内部访问变量ele也就是打印变量ele的时候,会依照就近原则先去访问函数son内部的定义的变量ele,若是找不到会一层层网上找,直到最上面一层,若是依旧找不到会提示not defined。但愿你能经过这个简单的案例理解做用域链。

  好啦,就说这么多咯,以上说法有不严谨之处还请各位指正,祝工做愉快!

相关文章
相关标签/搜索