我不是技术牛人,我不会写那些让人以为自己很厉害的文章,最主要是能够让别人和自己理清思路,共享的东西不一定要很高级的,对于我自己,不会做此要求。所以如果有牛人朋友觉得上一篇文章写得很浅,没办法,这一篇会更加浅。同时在这里感谢上一篇文章的读者给我揪出错误。

   距离上一篇文章已经好久了,没办法,由于做的笔记比较零散,我一直想完成js关于函数系列的随笔之后再写其他的,不过发现自己在函数方面做的笔记不集中,找了好久才找到另外一些内容,这也从一方面反映出我的不严谨,以后会注意的,尽量把相同内容的笔记集中在一起,讲完这些之后再写其他文章吧。

   前几天看到啊聪桌上有本JS猫头鹰,拿来一翻,我的GOD,纯英版,估计啊聪买的时候中文版还没有出...很努力地翻了一下,发现自己的词库量实在太贫乏了,除了一些平时看的专业用语,很多都还很陌生。翻到第二章的时候,看到一个有点眼熟的单词[Scope],Scope Chain,突然间就想起什么来,赶紧翻了一下笔记,还真找到了,就是函数作用链,这是一个函数中很重要的概念,但我尽然给遗忘了,注意,只是概念遗忘。我的笔记上写着:函数作用域链。我真怀疑当时做笔记的时候是不是脑袋给驴踢了,那么空的一页纸就只写了这一句话。然后又翻了一下书,没找着,于是百度,找一些文章出来仔细又看了一下,才勾起我的回忆。在这里我也只是大概说一下,读者您如果不了解的,可以去搜一下。

http://www.sj63.com/html/201006/2010060812142929103_1.html  这篇文章写得不错,够生动。

   其实就算不懂Scope Chain对于学JS的人关系真的不会很大,除非你真想成为一个JS大家,这些是比较低层的机制问题,要深究真的很费时费力。(这些话算是在安慰自己吧)

   用自己的话讲(比较烂),那就是,在一个函数被创建的时候Scope Chain由内到外地创建一个个要访问的变量及对象,这其实在闭包中用的比较多,不懂还是看上面那篇文章讲的吧。

   其实我是最讨厌用文字来描述的,我更喜欢看着代码,然后慢慢研究其中的道理,现在请看我们的代码:

<script type="text/javascript">
var global = "全局变量1";     
 function show1() {     
    alert(global);   
 }    
 
 function show2() {     
     var global = "局部变量2";     
     alert(global);        
 }  
   
 function show3() {     
     alert(global);  
     var global = "局部变量3";      
    alert(global);        
 }

show1();
show2();
show3();     
</script>

 运行代码之后依次显示的是“全局变量1” “局部变量2” “undefined” “局部变量3”

 其实大多数稍微学过JS的人都知道这个运行结果。牛人朋友可以从这里开始跳过或者直接关掉浏览器了。

 我们从头讲下来,show1函数里面没有定义global,所以一但函数执行,作用域链就会向上查找,找到全局变量global,将其输出;

                       show2函数定义了global变量,所以一但函数执行,作用域链首先遇到它自己定义的global变量,那就不再向上找global,将输出"局部变量2

                       show3函数有点不同,他先是直接想要alert出变量global出来,可能有些人会想到那他不就和第一个show1一样输出全局变量吗?先不管这个,看下去,show3又接着才定义自己的global并且给它赋值,再次alert出来。

  重点讲讲第三个函数,首先根据上一篇文章,我们知道函数在预编译阶段会先被定义,函数里面的变量也会被定义但是没有赋值(在这里又要感谢上一篇文章的留言者给我指出的错误),记住是没有被赋值,但是已经存在了,这时候机制自动给它初始化为undefined。待到函数被执行时,遇到global变量,但是这时候真正的赋值语句var global = "局部变量3";  还没有被执行,所以global还是undefined,所以才会先显示undefined,再显示局部变量,由于有了局部变量的存在,所以不管全局变量这时候是什么值都没有用了,所以才不会显示全局变量的值。

  这一篇文章写得比较多字而少代码,也很简单,所以希望大家见谅,不要BS我,再次强调,写博客就是为了分享学习经验而不是闭门造车,不管好坏,它总有一定的价值,至少对于写博客的人是这样。