閉包是什么?
背景:js中,無法從一個函數(shù)體外讀取函數(shù)體內(nèi)的變量,卻可以從函數(shù)體內(nèi)讀取外部的變量。
2,閉包用處:
a-異步事件
b-同步事件
c-同步事件。
需求:a 執(zhí)行完再執(zhí)行b,再執(zhí)行c
可以用個函數(shù)d把b ,c 包起來,d作為a的回調(diào)函數(shù),
閉包語法:
1,新建一個函數(shù)體,
2,放于有所需變量的函數(shù)內(nèi)部,并在新函數(shù)體內(nèi)調(diào)用所需變量,
3,原函數(shù)return新建函數(shù)。
```
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
```
講一下細節(jié): return f2與return f2()的區(qū)別,
首先,var result =f1()? result()等價于f1()(),
console.log(f1)表示打印f1這個函數(shù)體,
console.log(f1())表示打印f1的return值,因為此處return的是一函數(shù)名,并沒有加()執(zhí)行,所以打印f2函數(shù)體。
console.log(f1()())表示打印n? //999
總之一句話f1指函數(shù)體,f1()指返回值。
再舉個勉強的例子,比如,var result=f1(),其中f1體內(nèi)return {}
就表示result是一個對象。
什么叫匿名函數(shù)?
我的理解是,一個沒有名字的函數(shù)就叫匿名函數(shù)。跟函數(shù)的聲明沒關系。即函數(shù)聲明方式可以轉(zhuǎn)成匿名函數(shù),函數(shù)表達式可以轉(zhuǎn)成匿名函數(shù)。
簡單點,凡是function(){}這種結(jié)構,并且左邊沒有=賦值給一個變量,或者:賦值給一個對象屬性,那么就是匿名函數(shù)。所有位置的匿名函數(shù)中this都指向window(瀏覽器環(huán)境,node環(huán)境沒測試)

細節(jié):實驗過,在全局環(huán)境下直接寫function(){}會報錯。同時寫function(){}()也會報錯,
寫(function(){}())等立即執(zhí)行函數(shù)體不會報錯。
以上建立前提,全局環(huán)境下。
function(){}()跟(function(){})()的區(qū)別在于:
左邊表示函數(shù)的調(diào)用,指向是return后面的值,
右邊表示一個表達式,而不是一個函數(shù)。
此處應該有個例子的,不過我忘記我遇到的那個坑了。
匿名函數(shù)做閉包?怎么做?(?ω?)
```
(function(){
? ? ? ? var jQuery = function(selector){
? ? ? ? ? return new jQuery.prototype.init(selector);
? ? ? ? }
? ? ? ? ? ? jQuery.prototype = {
? ? ? ? ? ? ? ? constructor : jQuery,
? ? ? ? ? ? ? ? init:function (selector){
? ? ? ? ? ? ? ? ? ? var nodelist = document.querySelectorAll(selector);
? ? ? ? ? ? ? ? ? ? ? ? for(var i = 0,len = nodelist.length;i<len;i++){
? ? ? ? ? ? ? ? ? ? ? ? this[i] = nodelist[i];
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? this.length = len;
? ? ? ? ? ? ? ? ? ? ? ? return this;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
? ? ? ? window.$ = window.jQuery = jQuery;
? ? ? ? jQuery.prototype.init.prototype = jQuery.prototype;
? ? })();
```
把jQuery掛載到window.