全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

javascript 作用于作用域链的详解

javascript 作用于作用域链的详解

一、JavaScript作用域

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

全局作用域(Global Scope)

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

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

例如:

var authorName="Burce_zxy";
function doSomething(){
var blogName="旅行的意义zxy";
function innerSay(){alert(blogName);
}
innerSay();
}
alert(authorName); //Bruce_zxyalert(blogName); //脚本错误doSomething(); //旅行的意义zxyinnerSay() //脚本错误

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

function doSomething()
{
var authorName="Bruce_zxy";
blogName="旅行的意义zxy";
alert(authorName);
}
alert(blogName); //旅行的意义zxyalert(authorName); //脚本错误

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

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

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

局部作用域(Local Scope)

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

function doSomething()
{
var blogName="旅行的意义zxy";
function innerSay(){alert(blogName);
}innerSay();
}
alert(blogName); 

二、作用域链(Scope Chain)

在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。例如定义下面这样一个函数:

function add(num1,num2) 
{
var sum = num1 + num2;
return sum;
}

在函数add创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量。如下图所示(注意:图片只例举了全部变量中的一部分):


全局变量

函数add的作用域将会在执行时用到。例如执行如下代码:

var total = add(5,10);

执行此函数时会创建一个称为“运行期上下文(execution context)”的内部对象,运行期上下文定义了函数执行时的环境。每个运行期上下文都有自己的作用域链,用于标识符解析,当运行期上下文被创建时,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。这些值按照它们出现在函数中的顺序被复制到运行期上下文的作用域链中。它们共同组成了一个新的对象,叫“活动对象(activation object)”,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的前端,当运行期上下文被销毁,活动对象也随之销毁。新的作用域链如下图所示:

新作用域链

在函数执行过程中,没遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没找到继续搜索作用域链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义。函数执行过程中,每个标识符都要经历这样的搜索过程。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# javascript  # 作用于作用域链  # js  # 作用域链  # Javascript作用域和作用域链原理解析  # 图解javascript作用域链  # js作用域和作用域链及预解析  # 全面了解JavaScript的作用域链  # 详解JavaScript作用域和作用域链  # JavaScript闭包与作用域链实例分析  # JavaScript作用域链实例详解  # JavaScript执行环境及作用域链实例分析  # javascript基础进阶_深入剖析执行环境及作用域链  # JS作用域链详解  # JavaScript中作用域链的概念及用途讲解  # 都有  # 所示  # 链中  # 包含了  # 如下图  # 过程中  # 自己的  # 全局变量  # 一个函数  # 成了  # 最外层  # 也会  # 都要  # 也就  # 的说  # 如有  # 都能  # 出现在  # 两种  # 仅供 


相关文章: 图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  制作网站怎么制作,*游戏网站怎么搭建?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  如何实现建站之星域名转发设置?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  家庭服务器如何搭建个人网站?  Python多线程使用规范_线程安全解析【教程】  建站之星代理商如何保障技术支持与售后服务?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  香港服务器租用每月最低只需15元?  南京网站制作费用,南京远驱官方网站?  制作销售网站教学视频,销售网站有哪些?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何快速生成可下载的建站源码工具?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  如何自定义建站之星网站的导航菜单样式?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何在Tomcat中配置并部署网站项目?  C++时间戳转换成日期时间的步骤和示例代码  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何在阿里云ECS服务器部署织梦CMS网站?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  建站之星3.0如何解决常见操作问题?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何快速启动建站代理加盟业务?  网站制作网站,深圳做网站哪家比较好?  如何快速生成专业多端适配建站电话?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  建站之星安装后界面空白如何解决?  济南专业网站制作公司,济南信息工程学校怎么样?  大型企业网站制作流程,做网站需要注册公司吗?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站主机服务器选型指南与性能优化方案解析  ,网页ppt怎么弄成自己的ppt?  如何挑选高效建站主机与优质域名?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  中山网站制作网页,中山新生登记系统登记流程?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  如何选择适合PHP云建站的开源框架?  魔方云NAT建站如何实现端口转发?  如何挑选最适合建站的高性能VPS主机?  javascript中对象的定义、使用以及对象和原型链操作小结 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。