es6中的let聲明變量與es5中的var聲明變量的區別,局部變量與全局變量

本身經過看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);
  }
}());

也能夠傳遞一個自執行函數

相關文章
相關標籤/搜索