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