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

資訊專欄INFORMATION COLUMN

JavaScript閉包(closure)的學習

tianren124 / 1494人閱讀

摘要:下面讓我們來看一個例子上面就是一個最簡單的閉包。閉包的作用接下來來談?wù)勯]包的作用,初學者剛接觸時肯定是一臉懵逼,閉包的用處究竟是什么,下面就來談一談。同時也得感謝參考文章閉包的應(yīng)用讓你分分鐘理解閉包閉包,懂不懂由你,反正我是懂了

昨天在看思否時,發(fā)現(xiàn)了一篇文章是關(guān)于JavaScript如何實現(xiàn)重載的,由于以前也和學長討論過JavaScript是否能夠重載,就點進去看了看,發(fā)現(xiàn)里面的兩個方法的其中一個需要用閉包實現(xiàn),就看了幾篇博客學習了一下,順便寫篇博客加深一下印象。
(JavaScript重載的文章在這:https://segmentfault.com/a/11...)

什么是閉包

閉包的本質(zhì)是一個函數(shù)

閉包可以訪問函數(shù)內(nèi)部變量

閉包的存在會使內(nèi)部變量保留在內(nèi)存中

這個可以說是閉包比較容易讓人理解又比較全面的解釋了,更通俗一些:當function里嵌套function時,內(nèi)部的function可以訪問外部function里的變量。

下面讓我們來看一個例子:

function A(){
    function B(){
       console.log("Hello Closure!");
    }
    return B;
}
var C = A();
C();// Hello Closure!

上面就是一個最簡單的閉包。

就下來讓我們來看一下下面這個函數(shù),他是不是一個閉包呢?

 function foo(x) {
  var tmp = 3;
  function bar(y) {
    alert(x + y + (++tmp));
  }
  bar(10);
}
foo(2);

答案是:并不是,重新看一下閉包的定義,就明白了:

它能嗎?明顯不能,當你return的是內(nèi)部function時,就是一個閉包。

function foo(x) {
  var tmp = 3;
  return function (y) {
    alert(x + y + (++tmp));
  }
}
var bar = foo(2); // bar 現(xiàn)在是一個閉包
bar(10);

至于能保存的原因,看了看網(wǎng)友的解釋:

由于內(nèi)部函數(shù)嵌套在foo中,導致內(nèi)部函數(shù)的作用域鏈上添加了foo的作用域;而當內(nèi)部函數(shù)被返回后,也要保證其作用域鏈有效,因此,函數(shù)foo的作用域不得不被保留在內(nèi)存中以供內(nèi)部函數(shù)訪問。
閉包的作用

接下來來談?wù)勯]包的作用,初學者剛接觸時肯定是一臉懵逼,閉包的用處究竟是什么,下面就來談一談。

一.模仿塊級區(qū)域

首先簡單舉個例子來,解釋一下什么是塊級作用域:

function A(num) {
    for (var i = 0; i < num; i++) {
      num++;
    }
    console.log(i)
  }

在這個簡單的函數(shù)中,變量i是在for循環(huán)中定義的,如果是在C++或者Java中,這樣定義的變量,一旦循環(huán)結(jié)束,變量也就隨之銷毀,i的作用范圍只在循環(huán)這個小塊,就稱為塊級作用域。在javascript中,沒有這樣的塊級作用域,前面一篇文章已經(jīng)提到,變量是定義在函數(shù)的活動對象中的,因此,從定義i開始,在函數(shù)內(nèi)部可以隨時訪問它。
這樣的壞處顯而易見:由于javascript不會告訴你變量是否已經(jīng)被聲明,容易造成命名沖突,如果是在全局環(huán)境定義的變量,就會污染全局環(huán)境,因此可以利用閉包特性來模擬塊級作用域

明白了塊級作用域,接下來看看js怎么實現(xiàn)的吧:

function A(num) {
    //下面是一個匿名立即執(zhí)行函數(shù)
    //核心代碼
   (funnction(){
    for(var i = 0; i

使用這個就可以有效的避免全局污染,也許有人會對匿名立即執(zhí)行函數(shù)為什么是一個閉包感到困惑,如果有這個問題可以點擊這里查看

二.存儲變量

閉包的另一個作用是可以保存外部函數(shù)的變量

function StorageVariable(){
    var x = 100;
    return {
        function(){
            return x
        }
    }
}

var test = StorageVariable();//運行StorageVariable函數(shù),生成活動變量 x被test引用

這種寫法可能會用在把一些不經(jīng)常變動,但是計算比較復(fù)雜的值保存起來,就可以節(jié)省每次訪問的時間.

三.封裝私有變量

javascript中沒有私有成員的概念,我們可以把函數(shù)當做一個范圍,函數(shù)內(nèi)的變量就是私有變量:

function Person(){
    var name = "default";
    this.getName = function(){
        return name;
    }
    this.setName = function(value){
        name = value;
    }
}
var person = new Person()
console.log(person.getName())//default
console.log(person.setName("mike"))
console.log(person.getName())//mike

這樣就可以像私有變量一樣訪問和改變person的name了。

總結(jié)

不得不說寫博客總結(jié)對學習這種比較難的東西真的很有用,明明我昨天感覺自己已經(jīng)大概弄明白了,但在寫著寫著的時候又陷入了困惑,雖然寫完這個不敢說已經(jīng)完全弄懂了,但至少比昨天強了,但要完全掌握還任重而道遠,還得靠多使用。同時也得感謝

參考文章
js閉包的應(yīng)用
讓你分分鐘理解 JavaScript 閉包
閉包,懂不懂由你,反正我是懂了

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

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

相關(guān)文章

  • 通過示例學習JavaScript閉包

    摘要:譯者按在上一篇博客,我們通過實現(xiàn)一個計數(shù)器,了解了如何使用閉包,這篇博客將提供一些代碼示例,幫助大家理解閉包。然而,如果通過代碼示例去理解閉包,則簡單很多。不過,將閉包簡單地看做局部變量,理解起來會更加簡單。 - 譯者按: 在上一篇博客,我們通過實現(xiàn)一個計數(shù)器,了解了如何使用閉包(Closure),這篇博客將提供一些代碼示例,幫助大家理解閉包。 原文: JavaScript Clos...

    xingpingz 評論0 收藏0
  • 學習Javascript閉包Closure

    摘要:另一方面,函數(shù)外部無法直接讀取函數(shù)內(nèi)的局部變量。這說明,函數(shù)中的局部變量一直保存在內(nèi)存中,并沒有在調(diào)用后被自動清除。首先函數(shù)沒有使用關(guān)鍵字來聲明,因此是一個全局變量,而不是局部變量。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。 原文鏈接 - http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures...

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

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

    Heier 評論0 收藏0
  • javascript閉包介紹

    摘要:下面這個例子就是閉包,函數(shù)能夠訪問到不在其代碼塊里的變量。然而事實恰恰相反,唯一的解釋就是是一個閉包。性能問題執(zhí)行一次,就會重新構(gòu)造兩個函數(shù)。正確的做法應(yīng)該是參考資料深入理解閉包學習閉包阮一峰 概念 閉包(closure)是一個擁有任意變量以及綁定這些變量的環(huán)境(environment)的表達式(一般來說是就是function) A closure is an expression (...

    weij 評論0 收藏0
  • 掌握Javascript面試:什么是閉包?

    摘要:我的意思是大多數(shù)稱職的面試官會問你什么是閉包,并且在大多數(shù)時候你回答錯誤將失去這份工作。在閉包的范圍內(nèi)定義的任何公開方法都是特權(quán)的。使對象的數(shù)據(jù)私有化并不是閉包的唯一用途。 文章來源于:https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-closure-b2f0d2152b36 在J...

    jifei 評論0 收藏0

發(fā)表評論

0條評論

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