javascript作用于范围链的详细说明
javascript作用于范围链的详细解释
1.JavaScript范围
任何编程语言都有范围的概念。简单来说,范围就是变量和函数的可访问范围,也就是说,范围控制着变量和函数的可见性和生命周期。在JavaScript中,变量的作用域包括全局作用域和局部作用域。
全局范围(全局范围)
可以在代码中任何地方访问的对象都具有全局范围。一般来说,有几种情况具有全局范围:
(1)最外面的函数和在最外面的函数之外定义的变量具有全局范围,
例如:
var authorName=' Burce _ zxy函数do某物(){var blog name='旅行的意义zxy ';函数innerSay(){ alert(blogName);} innerSay();} alert(AuthorName);//Bruce _ zxyalert(blogName);//脚本错误dosome();travel的含义zxyinnerSay() //脚本错误(2)所有未定义直接赋值的变量都自动声明为具有全局作用域,例如:
函数dosomesing(){ var authorName=' Bruce _ zxy ';BlogName='旅行的意义zxy ';警报(AuthorName);} alert(Blogname);//旅行的意义zxyalert(AuthorName);//脚本错误变量blogName具有全局作用域,而authorName不能在函数外访问。
(3)窗口对象的所有属性都具有全局范围
一般来说,窗口对象的内置属性都有全局范围,比如window.name、window.location、window.top等等。
本地范围(本地范围)
与全局作用域相反,局部作用域一般只能在固定的代码片段中访问,最常见的是函数内部,有些人会把这个作用域看作是某些地方的函数作用域。例如,下面代码中的blogName和function innerSay只有局部作用域。
函数do某物(){var blog name='旅行的意义zxy ';函数innerSay(){ alert(blogName);} innerSay();} alert(Blogname);二、范围链(Scope Chain)
在JavaScript中,函数也是对象。事实上,JavaScript中的一切都是对象。像其他对象一样,函数对象具有可以通过代码访问的属性和一系列只能由JavaScript引擎访问的内部属性。内部属性之一是[[范围]],由第三版ECMA-262标准定义。该内部属性包含创建函数的范围内的一组对象。这个集合被称为函数的作用域链,它决定了函数可以访问哪些数据。
当一个函数被创建时,它的作用域链将在创建该函数的作用域中被可访问的数据对象填充。例如,定义以下函数:
函数add(num1,num 2){ var sum=num 1 num 2;返回总和;}创建函数add时,它的作用域链将被一个包含所有全局变量的全局对象填充。如下图所示(注:图片仅举例说明了所有变量的一部分):
全局变量
函数add的作用域将在执行过程中使用。例如,执行以下代码:
var total=add(5,10);执行该函数时,会创建一个名为“执行上下文”的内部对象,该对象定义了函数执行时的环境。每个运行时上下文都有自己的标识符解析范围链。创建运行时上下文时,其范围链被初始化为当前运行函数的[[范围]]中包含的对象。这些值按照它们在函数中出现的顺序复制到运行时上下文的范围链中。它们一起形成了一个新的对象,称为“激活对象”,它包含所有局部变量、命名参数、参数集和函数的这个。然后这个对象将被推到作用域链的前面,当运行时上下文被销毁时,活动对象将被销毁。下图显示了新的范围链:
新范围链
在函数执行过程中,如果没有遇到变量,会经过一个标识符解析过程,决定在哪里获取和存储数据。这个过程从作用域链的头开始搜索,即从活动对象开始搜索,并找到同名的标识符。如果找到,则使用对应于该标识符的变量。如果没有找到作用域链中的下一个对象,如果搜索后没有找到所有对象,则认为标识符未定义。在函数执行的过程中,每个标识符都要经过这样的搜索过程。
如有疑问,请留言或去社区交流讨论。感谢阅读,希望对大家有所帮助。感谢您对本网站的支持!
版权声明:javascript作用于范围链的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。