廢話不說;先來段代碼;函數
var scope='global'; function test(){ alert(scope); // 輸出undefine;而不是global var scope='local'; alert(scope); // 輸出local } test();
腦算下;你可能會認爲第一alert會輸出global;code
可是事實上第一個alert輸出的是undefined;作用域
這是怎麼回事呢?博客
要探討這個問題首先要解釋下兩個概念;it
1:函數做用域:io
函數做用域指的是函數內聲明的變量只在此函數內有效;function
2:聲明提早:class
聲明提早的意思是說在函數內任何位置聲明的變量都會提早至函數最上邊首先解析;test
理解聲明提早的概念後也就是說上面這段代碼等價於以下;變量
若是從字面上沒能理解這個聲明提早;那麼從代碼中就容易懂了;
var scope='global'; function test(){ var scope; // 先聲明瞭此變量 alert(scope); // 由於還未賦值;因此是undefine scope='local'; // 賦值 alert(scope); // 輸出local } test();
那麼引伸出來的經驗也就是說在函數體內首先把要用到的變量都在函數開始就聲明;
而不是說用到的時候才聲明變量;
至於爲何第一個alert不是輸出global;
由於函數體內的局部變量是會遮蓋全局變量的;
想必不用過多解釋;