標籤:區別 cal note img 技術 lob 範圍 範圍鏈 global
以下內容針對ES5
一,先說下變數提升:
1,全域執行內容中(一段script):變數定義,函式宣告(執行之前)
console.log(a) //undefinedvar a = 20;
以上代碼等同於:
var a; //變數提升到全域執行內容頂部,預設值為undefinedconsole.log(a); //undefineda = 20;
再看函式宣告:
fn(‘zs‘) //zs 20function fn(name) { age = 20; console.log(name, age); var age;}
以上代碼等同於:
function fn(name) { //函式宣告整體提升到全域執行內容的頂部 var age;//變數提升到函數執行內容頂部 age = 20; console.log(name, age);}fn(‘zs‘) //zs 20備忘:還是要規範編寫函數。不推薦上述寫法,要先定義後執行,增加可讀性。另外,注意函式宣告和函數運算式的區別,函式宣告可以在定義之前執行,函數運算式不可以,會報錯。Uncaught TypeError: fn1 is not a function
2,函數執行內容中:變數定義,函式宣告,this,arguments(執行之前)
二,JS範圍:1,沒有塊級範圍
// 沒有塊級範圍if(true) { var name = ‘lily‘}console.log(name); //lily
以上代碼等同於如下代碼(推薦如下寫法):
var name;if(true) { name = ‘lily‘;}console.log(name); //lily2,只有函數和全域範圍範圍鏈:在試圖訪問一個變數時,JS引擎會從當前範圍開始向上尋找直到Global全域範圍停止,範圍組成的有序集合就成為範圍鏈。三,this的幾種不同使用情境注意:this要在執行時才能確認值,定義時無法確認1,作為建構函式執行2,作為普通函數執行3,作為對象屬性執行4,call,apply,bind四,閉包未完待續...
JavaScript範圍和閉包