注:转两篇美文,作者详细讲解了执行环境、作用域、闭包和原型链等基础又无比重要的知识点,通过这两篇文章,我学会了这些知识点,转载以收藏,感谢作者。原文链接: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在作用域的定义上非常特别,例如下面的代码:

var name = "Microsoft";
 
function funcA(){
    var name = "Google";
    alert(name);
}
 
funcA(); //Google
alert(name); //Microsoft

其中第一个name是一个具有全局作用域的变量,而第二个name定义在funcA内部,所以其仅在funcA函数内部可见,同时,函数内部定义的变量会覆盖全局作用域内的同名变量,所以有上述执行结果。乍看之下没什么特别,但是如果稍微改变一下代码:

var name = "Microsoft";
 
function funcA(){
    name = "Google";
    alert(name);
}
 
funcA(); //Google
alert(name); //Google

相关文章:

  • 2021-09-28
  • 2021-11-04
  • 2022-12-23
  • 2021-04-24
  • 2021-07-30
  • 2021-04-06
  • 2021-12-28
猜你喜欢
  • 2021-12-04
  • 2021-08-25
  • 2021-09-05
  • 2021-11-23
  • 2021-04-11
  • 2022-12-23
  • 2021-11-22
相关资源
相似解决方案