用代码图解释Javascript中的范围和范围链

用代码图解释Javascript中的范围和范围链
范围代码的前三部分
/ / ========== 1 ==========

VAR范围=全球;
函数FN(){
警戒(范围);
VAR范围=乡土;
警戒(范围);
}
(FN); /输出
警报(范围); /输出

/ / =========== 2 ==========

VAR范围=全球;
函数FN(){
警戒(范围);
范围=乡土;
警戒(范围);
}
(FN); /输出
警报(范围); /输出

/ / =========== 3 =========

VAR范围=全球;
函数FN(范围){
警戒(范围);
范围=乡土;
警戒(范围);
}
(FN); /输出
警报(范围); /输出
这三段代码只有一点差别,但缺乏明显,1个案例是局部的,全局},{未定义的输出,2个案例是本地的,本地},{全局输出,3个输出{未定义的,本地的,全局的},如果不能得到Javascript域的作用,则不被理解。

行动的范围是什么

也许有人会问:变量A的范围是什么那么,函数A的作用域是什么呢变量和函数的范围分别是什么

让我们来看一下作用域的含义,动作的范围是函数和域。

功能:访问、操作、调用…
域:区域、范围、空间
操作的范围是变量和函数的可访问性,或者变量或函数的作用域。

该1.javascript功能范围:

函数中的区域是函数的范围,可以在这个区域访问变量和函数,外部函数的区域称为全局作用域,函数中的区域称为局部作用域。

2.javascript变量的范围:

源代码中变量的范围是变量的范围,变量可以在这个区域中访问。全局范围中定义的变量称为全局变量,函数中定义的变量称为局部变量。

简单地理解js源代码被函数}分割成块。这些区域将标识更改为函数或变量的范围。变量的范围和函数的范围很可能在源代码中引用相同的区域。

作用域链

范围链(范围链)是一种Javascript内部变量和函数查找机制,它决定变量和函数的范围,即范围的概念,理解范围链的原理,三个例子的文章也能理解,知道它也知道为什么。

作用域链是在文档ecmascript-262概念,Javascript引擎是通过ecmascript-262文件实现,了解Javascript引擎的工作原理有助于我们了解Javascript的特点,但大多数JS程序员不懂技术的最底层,所以读ecmascript-262文档,我们可以模拟Javascript引擎的直观性原则。

本文将通过1999 ecmascript-262-3th第三版解释的范围链的形成原理。它将介绍几个概念,如执行环境变量对象和活动对象、参数对象,作用域链,等2009 ecmascript-262-5th发布了第五版本,不同的是取消变量对象和活动对象的概念,介绍了词汇环境(词汇环境),环境记录(enviromentrecord)等新概念的概念,所以不要混淆这两个版本。

1。执行环境(执行上下文)

执行环境(执行上下文)也可以转化为执行上下文,当解析器在ECMAscript可执行代码,解析器将进入一个执行环境,执行环境,形成一个逻辑堆栈,这个逻辑执行环境是栈顶当前运行的执行环境。

注:在ECMAscript,有三个可执行代码,全球、功能及评价。全局环境是全局可执行代码,其功能是函数可执行代码,逻辑堆栈是一种特殊的数据存储形式,具有后进先出、后进先出的特点,首先将数据添加到逻辑堆栈的顶部,然后从顶部删除数据。
变量对象(变量对象)、活动对象(激活对象)和参数对象(参数对象)。

每个执行环境都有一个与之相关联的变量对象。当解析器进入执行环境时,它将创建一个变量对象,而变量对象保存在当前执行环境中声明的变量和函数的引用。

可变对象是一个抽象的概念,在不同的执行环境,可变对象有不同的身份,解析器进入任何执行环境之前,已经创建了一个全局对象,当解析器进入全局执行环境,全局对象将作为一个可变对象,当解析器为函数,将创建一个事件对象当对象变量。

2的两个阶段。解析器处理代码

我们都知道Javascript解析器是毛解析处理代码的一部分。这涉及解析器处理代码的两个阶段,解析代码和执行代码。

当解析器执行环境,可变对象将添加语句执行环境变量和函数作为它的属性,这意味着变量和函数声明中已经可以在该变量的值是未定义的变量和函数的声明,这是提升(提升)的原因,同时范围链这决定了这一过程的分析阶段,俗称预分析。然后解析器开始执行代码,添加一个引用到该变量的值,并得到执行的结果,这是执行阶段。

两个美味栗子:
var a=123;
var;
函数C(){
警报(11');
}
在上述全局环境中执行代码解析之后,全局对象用作变量对象以保存下列数据。
功能testfn(一){
var123;
函数C(){
警报(abc);
}
}

(10)testfn;
当解析器进入函数执行环境时,将创建一个事件对象作为变量对象,活动对象将创建一个参数对象,参数对象是一组参数,以保存参数。这就是为什么我们写函数可以使用参数{ 0 }来使用参数。
三.范围链(范围链)

每个执行环境都有一个与它相关联的范围链,当定义到执行环境的解析器时,范围链用于检索对象列表、每个变量对象变量和函数,这可以保证执行环境能够访问哪些变量和函数,例如。
创建一个'123;
功能testfn(b){
var c = ABC;

功能testfn2(){
var a 'efg;
警报(a);
}

testfn2();
}

(10)testfn;
的testfn2不声明变量,可为什么testfn2调用全局变量整个过程是怎样发生的请看下一张图片
当解析器进入全局执行环境时,只有在调用变量和函数时,才会在全局对象中找到它。

当解析器进入testfn函数的执行环境的{ { } }范围的函数首先填写全局对象,然后testfn主动对象形成一个作用域链之前添加到全局对象。
当解析器进入testfn2函数的执行环境的{ { } }范围的函数首先填充到作用域链父级,然后当前testfn2活动对象添加到作用域链的前端形成一个新的作用域链。

的testfn2变量被称为,在当前的testfn2对象先找,如果我们找不到作用域链向上,在对象变量的testfn活动,如果没有发现进一步下跌的作用域链寻找,直到最后发现在全局对象,或者是一个错误。所以外部环境可以被称为在函数内部的变量,外部环境无法调用函数内部的变量,这是函数的范围原则。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部