閉包以及匿名函數(shù)

閉包是什么?

背景: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)境沒測試)

圖片發(fā)自簡書App

細節(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.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,567評論 0 13
  • ● 閉包基礎 ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應用 ● 閉包缺點 ● 參考資料 1、閉包基礎 作用域和作...
    lzyuan閱讀 1,040評論 0 0
  • 曾經(jīng)夜里的雨落寞得像個孩子, 黃色也悄然滲入了樹上的葉子, 蟲兒安靜的不敢發(fā)出聲音, 水滴已吞噬了它的翅膀和腳丫,...
    眸莘閱讀 269評論 0 0
  • 我的人生似乎就是在不斷墮落中度過的,不是每一天的墮落,而是每一個階段的墮落。 剛上初中,我的目標是一中,那時候的我...
    kdkdkdkd閱讀 1,316評論 0 1
  • 該從何說起呢? 這是一個悲傷而又寬宏的故事。 “我叫黑麋鹿,大約算是最后一代純正的蘇族印第安人——不,或許已經(jīng)不能...
    八月石楠and云間花落閱讀 265評論 0 0

友情鏈接更多精彩內(nèi)容