任何程序设计语言都有做用域的概念,简单的说,做用域就是变量的做用范围。
在JavaScript中,变量分为全局变量和局部变量,与此相对应的,变量的做用域有全局做用域和局部做用域两种。
在函数外声明的变量为全局变量,全局变量所对应的做用域为全局做用域。看以下代码:函数
var globalEle = "世界这么大"; function func(){ console.log("函数内部:" + globalEle); } func(); console.log("函数外部:" + globalEle);
打印结果:spa
结果分析:设计
在函数外部声明了一个变量globalEle,所以它为全局变量,拥有全局做用域,全局变量不管在函数内部仍是函数外部均可以被访问。3d
在函数内声明的变量为局部变量,局部变量所对应的做用域为局部做用域。看以下代码:code
function func(){ var localEle = "而我在国内" console.log("函数内部:" + localEle); } func(); console.log("函数外部:" + localEle);
打印结果:blog
结果分析:ip
在函数内部声明了一个变量localEle,所以它为局部变量,拥有局部做用域,局部变量只能在当前声明的函数内起做用,所以在函数外访问局部变量会提示not defined。作用域
做用域链的创建过程此处不详细讲,一些官网定义的抽象的概念也很少加以阐述,就经过下面的例子来看一下,看以下代码: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。但愿你能经过这个简单的案例理解做用域链。
好啦,就说这么多咯,以上说法有不严谨之处还请各位指正,祝工做愉快!