自己通過看typescript官方文檔里的let聲明,與阮一峰老師翻譯的的es6學習文檔,總結以下三點
1、var聲明可以多次重復聲明同一個變量,let不行
2、let變量只在塊級作用域里面有效果,var 變量不存在塊級作用域(塊級作用域指用{}包裝的代碼塊,個人理解)
3、let變量不會聲明提前,var變量會
以下是具體例子
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到9
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);
}
}());
也可以傳遞一個自執行函數
