變量提高即將變量聲明提高到它所在做用域的最開始的部分,即函數聲明和變量聲明老是被JavaScript解釋器隱式地提高(hoist)到包含他們的做用域的最頂端。在ES6以前,JavaScript沒有塊級做用域(一對花括號{}即爲一個塊級做用域),只有全局做用域和函數做用域。前端
var name = 'Clam'; (function (){ console.log(name); })(); // Clam
上面的代碼很簡單。閒先聲明一個變量名爲name
的變量,同時賦值爲Clam
。後面是一個當即執行函數,在函數體中控制檯輸出name
。結果爲Clam
,沒毛病~接着看下面的代碼。函數
var name = 'Clam'; (function (){ console.log(name); var name = 'Klay'; })()
首先咱們本身分析一下上面的代碼哈:首先聲明瞭一個變量name
而且賦值爲Clam
,緊接着也是一個當即執行函數,在函數體中首先控制檯輸出了name
,可是以後,又聲明瞭賦值了一次變量name
。
那我來猜測一下,恩,控制檯輸出了Clam
,可是在當即執行函數結束以後,變量name
的值被修改爲了Klay
。
可是,上面的代碼運行的結果是:code
undifined // exm??
這就是我今天關注的東西:變量提高。ip
前面說過,變量提高會將變量的聲明提高到其做用域的最前端。這裏,name
所在的做用域就是指這個函數做用域,上面的代碼就至關於如下代碼。作用域
var name = 'Clam'; (function (){ var name; console.log(name); //undefined name = 'Klay'; })()
js中建立函數有兩種方式:函數聲明式和函數字面量式。只有函數聲明才存在函數提高。io
console.log(f1); // function f1() {} console.log(f2); // undefined function f1() {} var f2 = function() {}
以上,enjoyconsole