本身經過看typescript官方文檔裏的let聲明,與阮一峯老師翻譯的的es6學習文檔,總結如下三點javascript
一、var聲明能夠屢次重複聲明同一個變量,let不行java
二、let變量只在塊級做用域裏面有效果,var 變量不存在塊級做用域(塊級做用域指用{}包裝的代碼塊,我的理解)es6
三、let變量不會聲明提早,var變量會typescript
如下是具體例子閉包
for(var i=0;i<10;i++){ setTimeout(function(){console.log(i)},1000); }
因爲var聲明的變量會聲明提高var i 其實就是一個全局變量,console.log(i)裏面的i也是全局變量,i在異步函數執行前已經變爲了10異步
因此結果就連續輸出了十個10函數
for(let i=0;i<10;i++){ setTimeout(function(){console.log(i)},i*1000); }
因爲let聲明瞭一個局部變量,console.log(i)裏面的i是局部變量,每次循環時輸出的都是一個局部變量,因此學習
結果就連續輸出從0到9spa
let i; for(i=0;i<10;i++){ setTimeout(function(){console.log(i)},i*1000); }
輸出的是全局變量,因此輸出十個10翻譯
for(var i=0;i<10;i++){ setTimeout((function(i){console.log(i)})(i),i*1000); }
(function(i){console.log(i)})(i)將全局變量傳入方法裏,變成了一個局部變量,而後console.log(i)就是一個局部變量
因此結果是0到9;
方法裏面能夠把方法當作參數傳入,這時的參數若是是在()裏面定義的就是局部變量,在閉包裏面有用;
var a = function(){ console.log(11); } var b = function(a){ a(); } b(a);
參數a是一個函數,結果是11。
var b = function(a){ a(); } b( function(){ console.log(11); });
傳遞了一個匿名函數,結果也是11。
var b = function(a){ a(); } b( function a(){ console.log(11); });
a();
傳遞並聲明瞭一個函數a; a是一個全局函數,結果也是11,此時的函數聲明至關於在外面聲明的。
var b = function(a){ a(); } b( var a=function (){ console.log(11); });
報錯在function的()裏面的值是訪問的外部的值,在這裏面定義的是局部變量,不可以訪問,會報錯,因此這裏不能聲明變量。
var b = function(a){ a(); } b( a=function (){ console.log(11); });
11var b = function (a) {
a();
}
b(function () {
return function () {
console.log(11);
}
}());
也能夠傳遞一個自執行函數