JavaScript作用域精解

[[scope]]是每一个JavaScript函数都有得一个对象,对象中有些属性我们可以访问,但是有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。[[scope]]指的就是哦我们所说得作用域,其中储存了执行期上下文得集合。

  执行期上下文:当函数运行时,会创建一个称为执行期上下文得内部对象。一个执行期上下文定义了一个函数执行时得环境,函数每次执行时对应的执行上下文是独一无二的所以多次调用一个函数会多次创建多个执行期上下文,当函数执行完毕,它所产生的执行期上下文将被销毁。

作用域链:[[scope]] 中所储存得执行期上下文对象得集合,这个集合成链式链接,我们把这种链式链接叫做作用域链。

比如:

function a() {
}

a函数被定义的时候,a的作用域链 a.[[scope]] --> 0:aGO{}

当a函数被执行的时候,a.[[scope]] -->  0:aAO{}

1:GO{}

当a被执行完了之后,aAO{}就会被销毁。a的作用域链又回到了被定义的状态。当a再次被执行的时候,还会再创建一个全新的aAO{}对象,然后放在a的作用域链的最顶端。(关于AO和GO的介绍,请查看JavaScript的预编译)

var temp = 123;
function a() {
    var temp = 345;  console.log(temp);
}a();

在上面这个程序中,运行的结果是345;因为a执行的时候a.[[scope]] -->   0:aAO{ temp = 345}

1:GO{temp = 123}

程序会现在作用域的最顶端的0:aAO中找需要打印的变量temp,在aAO中找到了,就用这个temp,所以打印的结果就是345,当把a函数中的“var temp = 345;”去掉的话那么a的aAO中就不存在temp这个变量,这时候就会到作用域链的下一个去查找。在本例中,就是在GO中查找,在GO中找到了,就打印这个GO中的temp。如果找遍了都不存在的话,就报错,说使用了未声明的变量。

function a() {
   function b() {

   }  b();
}

在这个例子中,a被定义是创建了a的执行期上下文,a.[[scope]] -->  0:aAO{ }

1:GO{ }

而b是在a函数中定义的,那么b在运行时的执行期上下文应该是这样的b.[[scope]] -->  0:bAO{ }

1:a.[[scope]]

也就是b.[[scope]] -->  0:bAO{ }

1:aAO{ }

2:GO{ }

原文地址:https://www.cnblogs.com/xiaonongfu/p/11002863.html

时间: 2024-10-11 07:13:47

JavaScript作用域精解的相关文章

[已读]JavaScript编程精解

译者汤姆大叔,应该很多人都知道,他写了一系列的关于闭包与作用域理解的文章,但是由于创建了一些我不理解的新名词,我不爱看. <JavaScript编程精解>算是买得比较早的一本书,那会大肆搜罗js基础书籍,这本应该是在我看完<javascript高级程序设计(第二版)>之后,紧接着看的,金玉在前,所以,原谅我对它的印象不够好,另外,我没有耐心按照书中生态圈的例子一点一点敲代码,对很多人提到的这本书的趣味性也就没有体会. 关于内容,首先,它不适合没有基础的读者看,会有一点难看懂.第二,

JavaScript 编程精解 中文第三版 翻译完成

原书:Eloquent JavaScript 3rd edition 译者:飞龙 自豪地采用谷歌翻译 部分参考了<JavaScript 编程精解(第 2 版)> 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓库 赞助我 协议 CC BY-NC-SA 4.0 原文地址:https://www.cnblogs.com/wizardforcel/p/9125631.html

javascript 作用域详解

作用域理解:定义的变量.函数生效的范围.javascript 有全局作用域和函数作用域两种.注:es6实现let 块级作用域不是js原生的,底层同样是通过var实现的.如果想了解具体细节,请访问babel官方 对es6中let 进行解析. 执行上下文 范围:一段内或者一个函数内: 全局:函数声明.变量声明 .范围:: 函数:函数声明.变量声明.this.arguments.范围:一个函数内部: 函数.变量声明提升 <script> foo(); //打印a var foo = 1; funct

JavaScript编程精解 初读笔记

1.1 值 JavaScript里有6种基本类型的值: number.string.Boolean.object.function和undefined. 1.3.2 prompt和confirm 浏览器提供的标准环境包含了更多用于弹出窗口的函数,可以使用confirm函数让用户选择OK/Cancel问题.该函数返回布尔值:如果用户单击OK,则返回true:如果单击Cancel,则返回false. prompt函数可用于询问一个开放式问题,第一个参数就是该问题:第二个参数是用户需要输入文本的开头部

《JavaScript编程精解》读书笔记

第一章 JavaScript基础:值.变量.控制流程 JavaScript里有六种基本类型:number类型.string类型.boolean类型.object.function和undefined. 1)数字number类型的二进制存储方式: 标准的JavaScript数字描述是64位的浮点型,即double型,遵循IEEE754规范.存储格式如下: 以144的存储为例: 144=1.44* 参考链接,还应留意移码.补码的概念: http://www.cnblogs.com/wz327/arc

JavaScript 作用域链图详解

<script type="text/javascript"> /** * 作用域链: */ var a = "a"; function hao947(){ var b = "b"; alert(a);// output a alert(b);// output b // alert(c);// output undefind function hao(){ var c = "c"; alert(a);// out

[javascript]模块化&amp;命名污染—from 编程精解

最近看了编程精解里面的模块化一章,很受启发. /****************/ 在开发的实际过程中,根据页面或者逻辑布局,js代码可以按照功能划分为若干个区块:数据交互.表单验证.页面布局等等模块 为了提高开发效率和后期代码维护,很自然的应该将几十个js函数划分为模块,利于调试和后续修改.但写出几十个函数的时候,命名自然就出现问题了,想不出别的函数名或者干脆两个函数重名了,这种因为重复声明而导致的bug称为命名污染,这在大型项目中很常见. 提到模块开发,最容易想到的是通过js文件来分模块存储

JavaScript作用域及作用域链详解、声明提升

相信大家在入门JavaScript这门语言时对作用域.作用域链.变量声明提升这些概念肯定会稀里糊涂,下面就来说说这几个 Javascript 作用域 在 Javascript 中,只有局部作用域和全局作用域.而只有函数可以创建局部作用域,像 if,for 或者 while 这种块语句是没办法创建作用域的. (当然 ES6 提供了 let 关键字可以创建块作用域.) Javascript 的这种特性导致 for 循环里面创建闭包时会产生让人意想不到的结果.比如下面这个例子: var i = 20;

【刘文彬】【精解】开发一个智能合约

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/contract.html 智能合约 这两天被老大搞去搬砖,学习计划有变但无大碍,这篇文章将仔细分析智能合约相关内容. 关键字:智能合约,remix,Solidity,truffle,geth,leveldb,datadir,ganache,web3j 合约 合约也称合同.协议,是甲乙双方参与的,制定一系列条目规范双方权利与义务的文件.智能合约是电子化的,自动执行的,去中心化的,具有不可抵赖性,本质上它