******标题很吓人************
其实就是一个小小的例子 ,从例子中简单的分析一下作用域、预解析和变量提前的概念
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>关于js中的那些小知识点</title> </head> <body> </body> <script> var a=1; function zero(){ alert(a); var a=2; alert(a); } zero(); </script> </html>
你会看到这里的结果第一次弹窗是undefined 第二次是2
也许会有人疑问为什么第一次弹出来不是1 呢?(知道的大神不要喷我)
分析名词:作用域
其实在javascript语言里只有函数是可以提供作用域,换句话说javascript里有且只有函数作用域,没有其他的作用域。因此要理解作用域必须从函数讲起!
那么咱们说一下这个函数的作用域
函数的作用域(其实作用域可以理解为一个箱子,姑且这么理解吧就是一个封闭性的东西 而且很霸道,他可以拿外边人的东西,但是外边的人不能拿 箱子里的东西 想要拿必须经过同意)//xx 好像晦涩难懂
分析名词:预解析(就像c语言一样你写完了代码不能直接运行你要编译一下 这个预解析很类似那个编译的过程)
预解析就是电脑先看一边心里有个数 知道了那个是变量 那个是函数声明 函数中是否有局部变量 等等等等。。。
分析名次:变量提前(顾名思义就是我声明的变量提前到了这个顶部【作用域的顶部】)
咱们用一个例子解释一下变量提前(代码一和代码二的代码作用相似)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>代码一</title> </head> <body> </body> <script> function zero(){ alert(a); var a=2; } zero(); </script> </html>
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>代码二</title> </head> <body> </body> <script> function zero(){ var a;//没有赋值的情况下默认是undefined alert(a); } zero(); </script> </html>
以上两个代码的作用是相似的也就是代码二就是变量提前的做法
讲了这么多 也该说一下这个例子了
从预解析开始讲解(因为电脑也是先预解析在执行的)
首先 全部变量 声明了一个a=undefined
然后声明了一个函数 zero zero函数中还有一个局部变量a=undefined(到此解析完毕)
然后开始执行 执行的当然是函数了。。。所以我们先看函数
函数中变量的提前请看代码二 于是第一次弹出来就是undefined 弹出来undefined之后变量赋值了(对,你没看错就是赋值了) 那么再次执行的话就是2 (为什么不是1 因为函数中自己有变量啊 于是就覆盖了全局变量)
举个例子说明 : 你要炒鸡蛋 你发现你的家中有鸡蛋 于是你就不会去买了 或者拿别人的了吧(不要钻牛角 说鸡蛋不够用啊)
终于写完了 休息一下
ps:写的比较浅 希望大家能多多指点。。。