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


自己通過看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);
  }
}());

也可以傳遞一個自執行函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM