閉包、循環setTimeout、當即執行函數

// 函數閉包
/*
*閉包函數是指有權訪問另外一個函數做用域中的變量的函數,
* 建立閉包函數最多見的方式是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量
* 閉包的特色:1函數嵌套函數,
* 2 函數內部能夠引用外部的參數和變量
* 3 參數和變量不會被垃圾回收機制回收
* 閉包的優勢:1 但願一個變量長期駐紮在內存中
* 2 避免全局變量的污染
* 3 私有變量存在
* 閉包的實現 1:函數嵌套函數
* 2 外層函數返回內層函數
* 3 外面有一全局變量接受外層函數
* */javascript

function fun1() { var sum=0; function fun2() { sum++; return sum } return fun2 } var s=fun1(); console.log(s()); console.log(s()); console.log(s()); s=null; console.log(s);

執行結果:java

回調函數也是閉包es6

 

for(var i=0;i<6;i++){
  setTimeout(function(){
    console.log(i)
  },i*1000)
}

執行結果:閉包

每一秒打印一個6,setTimeout是異步的,for循環出6個setTimeout,等全部同步執行以後,在執行setTimeout裏面的內容,此時全局的i已經變成了6異步

要獲得預期效果,每一秒打印一個i,能夠使用閉包當即執行函數。也能夠把var改爲let,利用es6塊做用域函數

當即執行函數:讓函數成函數表達式spa

要想當即執行函數能作到當即執行,要注意兩點,一是函數體後面要有小括號(),二是函數體必須是函數表達式而不能是函數聲明。code

()!=  + - void 均可以使函數成爲當即執行函數blog

(function(test){
  console.log("test=",test)
})(1)
!function(test){
  console.log("test=",test)
}(2)
+function(test){
  console.log("test=",test)
}(3)
-function(test){
  console.log("test=",test)
}(4)
let fn=function(test){
  console.log("test=",test)
}(5)
void function(test){
  console.log("test=",test)
}(6)
相關文章
相關標籤/搜索