成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

什么是閉包?

zxhaaa / 2303人閱讀

摘要:無論焦點在哪個輸入域上,顯示的都是關(guān)于年齡的消息該問題的原因在于賦給是閉包中的匿名函數(shù)而不是閉包對象解決這個問題的一種方案是使指向一個新的閉包對象。

閉包定義 對閉包的具體定義有很多種說法,這些說法大體可以分為兩類:

閉包是其詞法上下文中引用了自由變量的函數(shù).

閉包是由函數(shù)和其相關(guān)的引用環(huán)境組合而成的實體.

詞法:變量的作用域是由它在源碼中所處位置決定的.

很多人都覺得閉包是一個很難理解的知識點,其實不然,不管它的定義有多難理解,我們只需自己對它形成一種自己可以理解的定義就可以了,并保證這種自我理解定義的正確性和可行性.

在這里來看,閉包不管他是一個函數(shù)還是一個實體,它給我的理解就是一個函數(shù)可以訪問當(dāng)前上下文的環(huán)境變量.在這樣看來,不管是函數(shù)內(nèi)部的函數(shù),還是單個定義的函數(shù),有函數(shù)的地方就存在閉包.

閉包的特性和好處 閉包的特性:

函數(shù)內(nèi)部可以引用外部的參數(shù)和變量.

參數(shù)和變量不會被垃圾回收機制回收.

使用閉包的好處

希望一個變量長期保存在內(nèi)存中

可以擁有私有成員

在函數(shù)內(nèi)部存在函數(shù)形式的閉包中,可以避免全局變量的污染

舉例 函數(shù)內(nèi)部函數(shù)
function init() {
  var name = "closure";
  function displayName() {
    alert(name);
  }
  displayName();
}
init();

函數(shù) init() 創(chuàng)建了一個局部變量 name,然后定義了名為 displayName() 的函數(shù)。 displayName() 是一個內(nèi)部函數(shù)——定義于 init() 之內(nèi)且僅在該函數(shù)體內(nèi)可用。displayName() 沒有任何自己的局部變量,然而它可以訪問到外部函數(shù)的變量,即可以使用父函數(shù)中聲明的 name 變量。

用閉包模擬私有方法
var makeCounter = function() {
  var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }  
};

var Counter1 = makeCounter();
var Counter2 = makeCounter();
alert(Counter1.value()); /* 提示 0 */
Counter1.increment();
Counter1.increment();
alert(Counter1.value()); /* 提示 2 */
Counter1.decrement();
alert(Counter1.value()); /* 提示 1 */
alert(Counter2.value()); /* 提示 0 */

請注意兩個計數(shù)器是如何維護(hù)它們各自的獨立性的。每次調(diào)用 makeCounter() 函數(shù)期間,其環(huán)境是不同的。每次調(diào)用中, privateCounter 中含有不同的實例。
這種形式的閉包提供了許多通常由面向?qū)ο缶嶶所享有的益處,尤其是數(shù)據(jù)隱藏和封裝。

在循環(huán)中創(chuàng)建閉包:一個常見錯誤

Helpful notes will appear here

E-mail:

Name:

Age:

function showHelp(help) {
  document.getElementById("help").innerHTML = help;
}

function setupHelp() {
  var helpText = [
      {"id": "email", "help": "Your e-mail address"},
      {"id": "name", "help": "Your full name"},
      {"id": "age", "help": "Your age (you must be over 16)"}
    ];

  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = function() {
      showHelp(item.help);
    }
  }
}

setupHelp();

運行這段代碼后,您會發(fā)現(xiàn)它沒有達(dá)到想要的效果。無論焦點在哪個輸入域上,顯示的都是關(guān)于年齡的消息,
該問題的原因在于賦給 onfocus 是閉包(setupHelp)中的匿名函數(shù)而不是閉包對象;

解決這個問題的一種方案是使onfocus指向一個新的閉包對象。

function showHelp(help) {
  document.getElementById("help").innerHTML = help;
}

function makeHelpCallback(help) {
  return function() {
    showHelp(help);
  };
}

function setupHelp() {
  var helpText = [
      {"id": "email", "help": "Your e-mail address"},
      {"id": "name", "help": "Your full name"},
      {"id": "age", "help": "Your age (you must be over 16)"}
    ];

  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
  }
}

setupHelp();
性能考量

如果不是因為某些特殊任務(wù)而需要閉包,在沒有必要的情況下,在其它函數(shù)中創(chuàng)建函數(shù)是不明智的,因為閉包對腳本性能具有負(fù)面影響,包括處理速度和內(nèi)存消耗。

例如,在創(chuàng)建新的對象或者類時,方法通常應(yīng)該關(guān)聯(lián)于對象的原型,而不是定義到對象的構(gòu)造器中。原因是這將導(dǎo)致每次構(gòu)造器被調(diào)用,方法都會被重新賦值一次(也就是說,為每一個對象的創(chuàng)建)。

考慮以下雖然不切實際但卻說明問題的示例:

function MyObject(name, message) {
  this.name = name.toString();
  this.message = message.toString();
  this.getName = function() {
    return this.name;
  };

  this.getMessage = function() {
    return this.message;
  };
}

上面的代碼并未利用到閉包的益處,因此,應(yīng)該修改為如下常規(guī)形式:

function MyObject(name, message) {
  this.name = name.toString();
  this.message = message.toString();
}
MyObject.prototype = {
  getName: function() {
    return this.name;
  },
  getMessage: function() {
    return this.message;
  }
};

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85971.html

相關(guān)文章

  • JS 中的閉包什么?

    摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么??吹介]包在哪了嗎閉包到底是什么五年前,我也被這個問題困擾,于是去搜了并總結(jié)下來。關(guān)于閉包的謠言閉包會造成內(nèi)存泄露錯。閉包里面的變量明明就是我們需要的變量,憑什么說是內(nèi)存泄露這個謠言是如何來的因為。 本文為饑人谷講師方方原創(chuàng)文章,首發(fā)于 前端學(xué)習(xí)指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...

    Enlightenment 評論0 收藏0
  • 什么閉包?為什么閉包?使用閉包應(yīng)注意什么

    摘要:一什么是閉包閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。就是創(chuàng)建了一個匿名函數(shù)調(diào)用函數(shù)解除對匿名函數(shù)的引用,以便釋放內(nèi)存 一、什么是閉包? 閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。 二、為什么要閉包 說明:變量分為全局變量的局部變量,全局變量的作用域為全局作用域,局部變量作用域為局部作用域。之前一篇文章關(guān)于作用域鏈給了介紹...

    raledong 評論0 收藏0
  • 面試官問我:什么JavaScript閉包,我該如何回答

    摘要:到底什么是閉包這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數(shù)的作用域及其所有變量都會在函數(shù)執(zhí)行結(jié)束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設(shè)計理念,有人說所有的函數(shù)都是閉包。到底什么是閉包?這個問題在面試是時候經(jīng)常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...

    BenCHou 評論0 收藏0
  • 多層級理解閉包

    摘要:第二梯隊理解有了第一梯隊的認(rèn)識,我們慢慢修正大腦中對閉包的認(rèn)識。理解這句話就可以很好的與閉包這兩個字關(guān)聯(lián)起來理解閉包這個概念了。總結(jié)第二梯隊理解閉包是一個有特定功能的函數(shù)。第四梯隊理解閉包通過訪問外部變量,一個閉包可以維持這些變量。 閉包 閉包的概念困惑了我很久,記得當(dāng)時我面試的時候最后一面有一個問題就是問題關(guān)于閉包的問題,然而到現(xiàn)在已經(jīng)完全不記得當(dāng)時的題目是啥了,但仍然能夠回憶起當(dāng)時...

    nemo 評論0 收藏0
  • The Little JavaScript Closures

    摘要:寫在前面本文嘗試模仿的風(fēng)格,介紹的閉包。本文同時也是我學(xué)習(xí)閉包的一次總結(jié)。注根據(jù)這篇文章,事實上所有函數(shù)在創(chuàng)建的時候都會形成閉包。但這種閉包并沒什么趣味,也沒什么特別的用途,所以我們更關(guān)注的是由內(nèi)部函數(shù)形成的閉包。 寫在前面 本文嘗試模仿 The Little Schema 的風(fēng)格,介紹 JavaScript 的閉包。本文同時也是我學(xué)習(xí) JavaScript 閉包的一次總結(jié)。歡迎一起討...

    Heier 評論0 收藏0
  • 什么閉包閉包的優(yōu)缺點?

    摘要:什么是閉包閉包的優(yōu)缺點閉包是的一大難點,也是它的特色。閉包的用途閉包可以用在許多地方。閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。 什么是閉包?閉包的優(yōu)缺點? 閉包(closure)是javascript的一大難點,也是它的特色。很多高級應(yīng)用都要依靠閉包來實現(xiàn)。 1、變量作用域 要理解閉包,首先要理解javascript的特殊的變量作用域。變量的作用域無非就兩種:全局變量和局部變量。...

    fireflow 評論0 收藏0

發(fā)表評論

0條評論

zxhaaa

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<