基礎知識
在這個課題開始之前我們先做一些基礎知識的講解
1、在頂級的區域內聲明的變量為 window級別的變量。 也就是說var a=100 等價於 window.a=100;
2、局部的重新聲明變量沒有意義。var a=100;var a;后面的將沒有意義。
3、在有參數函數的定義中 function abc(p1){} abc(1),在函數執行中,先構建,在執行,會有兩個步驟,所以說當函數執行之前構建過程中,將臨時生成代碼 var p1=1;將來一切不賦值的聲明將變得沒有意義。
var p1;//沒有意義
var p1=2;//有意義。
開始進入正題
全局作用域和局部作用域
全局作用域:整個JS執行環境
局部作用域:通過創建一個函數就開辟出了一個局部作用域
全局變量和 局部變量
全局變量:在全局作用域都可以訪問的變量
局部變量:只能在當前局部作用域訪問的
變量聲明提升:
如果變量聲明在函數里面,則將變量聲明提升到函數的開頭
如果變量聲明是一個全局變量,則將變量聲明提升到全局作用域的開頭
變量運行(搜索)機制:
首先看,有沒有局部作用域
如果有,查找是不是這個局部作用域定義的變量
如果不是,尋找上一級作用域,直到找到全局作用域
如果全局作用域也找不到這個變量,這個變量就是未定義的 undefined
第一題:
var a=1; function test(){ console.log(a); var a=1; } test();
根據變量聲明提升和變量搜索機制,函數test()應為
function test(){ var a; console.log(a);//此時由於a並咩有被賦值,所以也就是undefined a=1; }
第二題:
var b=2; function test2(){ window.b=3; console.log(b);//值為3 } test2();
任何通過附加在window上的變量都相當於聲明一個全局變量,或者是給全局變量賦值
第三題:
c=5; function test3(){ window.c=3; console.log(c); var c; console.log(window.c); } test3();
根據變量聲明提升和變量搜索機制:
c=5;//聲明一個全局變量c function test3(){ var c;//變量聲明提升,聲明一個局部變量 window.c=3;//改變全局變量c的值 console.log(c);//由於此時的c是一個局部變量c,並且沒有被賦值 c就是undefined console.log(window.c);//此時的c就是一個全局變量c,也就是值為3 } test3();