JavaScript 11

作用域

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

全局作用域(Global Scope)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

(1)在最外层函数外面定义的变量拥有全局作用域

var authorName="山边小溪";

function doSomething(){

var blogName="梦想天空";

function innerSay(){

alert(blogName);

}

innerSay();

}

alert(authorName);

alert(blogName);

doSomething();

innerSay() ;

(2)所有末定义直接赋值的变量自动声明为拥有全局作用域,

function doSomething(){

var authorName="山边小溪";

blogName="梦想天空";

alert(authorName);

}

doSomething();

alert(blogName);

alert(authorName);

变量blogName拥有全局作用域,而authorName在函数外部无法访问到

(3)所有window对象的属性拥有全局作用域

一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

局部作用域(Local Scope)

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域

function doSomething(){

var blogName="梦想天空";

function innerSay(){

alert(blogName);

}

innerSay();

}

alert(blogName); //脚本错误

innerSay(); //脚本错误

作用域链(Scope Chain)

由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链 ,链头就是变量所处的对象,链尾就是window对象

var n=1;

function show(){

var n=2;

alert(n);

}

show();

当函数show执行的时候,首先在函数show内部查找变量n,没有找到,再向外层查找,找到了全局变量n,alert显示结果为1。

原理就是JavaScript作用域是层层包含的,外层的作用域在内层有效,执行的时候,从内层向外层查找

局部变量优先级高于全局变量

var n=1;

function show(){

var m=2;

var n=3;

alert(n);  //显示结果为3

}

show();

根据上面变量作用域链的原理,函数执行时,会先从内层向外层查找,如果在内层中找到变量,查找就会停止。所以内层的作用域会优先于外层,局部优先于全局。

var n=1;

function show(){

var m=2;

var n=3;

alert(window.n);  //显示结果为1

}

show();

为什么会是1,而不是3呢,只是另外一个问题:全局变量都是window对象的属性,任何的全局变量都是window对象的属性,都可以用window.*来引用。(*代表一个变量)

函数内部的var声明的变量作用域

在函数内部使用var声明的变量,不论在何处声明,该变量都拥有整个函数的作用域。

var n=1;

function show(){

alert(n);  //undefined

alert(this.n); //显示为1

var n=3;  //声明局部变量n

alert(n);  //显示为3

}

show();

第一个问什么会显示undefined呢,这个问题的原因就是在函数后面声明了局部变量n=3,在函数show执行的时候,会先从内层查找变量n,结果找到了,但在第一个alert的时候,n还没有赋值,故结果为undefined。

每天的沉淀都是为了有更好的明天,上天不会辜负每个努力的人,只要你坚持下去,相信自己,为自己加油!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,701评论 0 6
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 来源:仗剑走天涯! 关于javascript的作用域的一些总结,主要参考以上文章,加上自己的整理的理解。 近日对j...
    Michael_林阅读 952评论 0 1
  • ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...
    lzyuan阅读 960评论 0 0
  • 你是怎样的存在。 最近的状况特别不好。已经上班近三个周了。但一直没在上班状况。失去了方向。 前方没有道路,我不知道...
    向阳Sx阅读 127评论 0 0