注:转两篇美文,作者详细讲解了执行环境、作用域、闭包和原型链等基础又无比重要的知识点,通过这两篇文章,我学会了这些知识点,转载以收藏,感谢作者。原文链接:http://www.cnblogs.com/leoo2sk/archive/2010/12/19/ecmascript-scope.html
首先说明,对于JavaScript这门脚本语言,我是个菜鸟。虽然也写过不少JavaScript代码,但一直是不求甚解,直到最近才开始系统学习这门语言。学习的原因是我即将毕业,过了年就要正式工作了,而我要入职的职位对JavaScript有一定要求,所以我就在准备毕业答辩之余,挤时间学习JavaScript。我学习语言习惯从标准入手,所以我最近研读了《Standard ECMA-262 3th edition》。虽然ECMAScript不完全等价于JavaScript,但是它相当于JavaScript在语言范畴内的标准,详细定义了其实现的特性及行为(JavaScript是ECMAScript的一个实现),所以我相信研读ECMA-262是学好JavaScript的第一步。
在学习中,我发现ECMAScript的标准定义很特别,很多地方容易让人迷惑和混淆,同时也有一些很有意思的特性,所以我决定分几个主题系统总结一下,这第一篇的主题是“执行环境及作用域(Execution Contexts & Scope)”。
这一篇文章(以及其后续文章中),虽然是讨论JavaScript,但只讨论ECMAScript的内容,而不会涉及JavaScript中超出其范围的部分(如DOM、事件等),也就是文章会纯粹着眼于语言特性、行为和标准的角度,特别是ECMAScript与惯用语言(如C、Java、C#)一些不同之处,这也是为什么本文标题叫做《解读ECMAScript》而不是《解读JavaScript》,当然,具体示例代码使用JavaScript。
文章中示例代码的执行结果将以Google浏览器为准,但同时尽量确保示例代码兼容主流浏览器。ECMA-262标准以3th edition为准。
从几个琐碎的例子说起
提到变量的作用域(Scope)大家一定不陌生,一个变量的作用域简单来说就是能访问到这个变量的区域,对于C#语言,相信大家对各种变量的作用域已经烂熟于胸了,但是ECMAScript在作用域的定义上非常特别,例如下面的代码:
其中第一个name是一个具有全局作用域的变量,而第二个name定义在funcA内部,所以其仅在funcA函数内部可见,同时,函数内部定义的变量会覆盖全局作用域内的同名变量,所以有上述执行结果。乍看之下没什么特别,但是如果稍微改变一下代码:
相关文章:
-
2021-09-28
-
2021-11-04
-
2022-12-23
-
2021-04-24
-
2021-07-30
-
2021-04-06
-
2021-12-28