国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

hello,閉包

tulayang / 3352人閱讀

摘要:由于閉包函數是由調用的,所以一般它的指向。因為閉包記住了它定義時候的作用域呀,這個時候的是塊級的,能夠好好地保存起來被閉包函數使用。

定義

當函數可以記住并訪問它定義時候的作用域,就產生了閉包。也就是說,一個函數在另外一個函數里面定義,但是它執行的時候,可能是在其他的作用域,但是它還是能夠憑著出生時的回憶,找到定義時的作用域,去訪問里面的變量。

    function foo() {
        var a = 2;
        function bar() {
            console.log(a)
        }
        return bar;
    }
    
    var bar = foo();
    bar();//記住了定義時的作用域,所以還是可以訪問到a,這里會輸出2

為什么能夠訪問到定義時候的作用域呢?答案只有一個,定義閉包的函數是個重情義的家伙,考慮到那個寶寶可能隨時要用到它里面的變量,都不肯被回收。沒錯,這樣會導致foo的作用域一直沒有被回收,有一點浪費內存空間。

關于this對象

一般函數的this指向的是調用它的對象。由于閉包函數是由window調用的,所以一般它的this指向window。如果你需要讓它指向某個對象,可以用call或者把外部的this保存起來,在里面直接使用。

    var name = "window";
    var object = {
        name: "My Object",
        //var that = this;
        getNameFunc: function() {
            return function() {
                console.log(this.name);
                //console.log(that.name);
            }
        }
    }
    
    object.getNameFunc()();//輸出"window"
    object.getNameFunc().call(object);//輸出"My Object"
循環和閉包

很常見的一段代碼,運行結果就是輸出5個5。因為這里的i沒有塊級作用域,也就是說閉包里面的函數訪問到外部的變量i只有一個,加上setTimeout是異步的,執行到里面的回調的時候,外面的這個i的值就是循環結束后的值5。

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

在沒有let的時候,我們都是通過模仿塊級作用域來解決。這個時候,閉包函數定義的作用域變成了(function(){}),然后在這個作用域里面把i的值賦值給j,每個閉包函數訪問到的j就是它定義時候作用域已經保存好了的,自然就能夠正確的輸出。

     for(var i = 0; i < 5; i++) {
         (function() {
            var j = i;
            setTimeout(function() {//閉包
                console.log(j);
            }, 1000)
         })()
    }

當然,我們一般都舍不得再用一個j來保存,直接用傳參數的形式,讓塊級作用域可以訪問到i的值。

     for(var i = 0; i < 5; i++) {
         (function(j) {
            setTimeout(function() {//閉包
                console.log(j);
            }, 1000)
         })(i)
    }

簡單改一下,每次用個塊級作用域的let來保存一下是不是就可以了啊

    for(var i = 0; i < 5; i++) {
        let j = i;
        setTimeout(function() {
            console.log(j);
        }, 1000)
    }

哈哈哈,真的就輸出0 1 2 3 4 5了。因為閉包記住了它定義時候的作用域呀,這個時候的j是塊級的,能夠好好地保存起來被閉包函數使用。
其實就是相當于每次循環都會去聲明一個j,然后這個j的作用域就屬于這次循環,所以可以直接把j的賦值寫在for循環里。

    for(let j = 0; i < 5; i++) {
        setTimeout(function() {
            console.log(j);
        }, 1000)
    }
模塊化

可以使用閉包來實現模塊化的。

    var module = (function(window) {
        function test1() {
        }
        functon test2() {
        }
        
        return {
            test1: test1,
            test2: test2
        }
    })(window)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95393.html

相關文章

  • 說說Python中的閉包 - Closure

    摘要:閉包可以用來在一個函數與一組私有變量之間創建關聯關系。夾帶私貨外部變量返回的是函數,帶私貨的函數支持將函數當成對象使用的編程語言,一般都支持閉包。所以說當你的裝飾器需要自定義參數時,一般都會形成閉包。 Python中的閉包不是一個一說就能明白的概念,但是隨著你往學習的深入,無論如何你都需要去了解這么一個東西。 閉包的概念 我們嘗試從概念上去理解一下閉包。 在一些語言中,在函數中可以(嵌...

    leon 評論0 收藏0
  • 閉包,又見閉包。。。。?

    摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數作用域達到了訪問外層變量的目的。此時一個完整的閉包實現了,的垃圾回收機制由于閉包的存在無法銷毀變量。 1.閉包是指有權訪問另一個函數作用域中的變量的函數。 上面這段話來自 javascript 高級程序設計 第三版 P178 。作者說閉包是一個函數,它有訪問另一個函數作用域中的變量的能力。 2.函數訪問它被創建時所處的...

    keelii 評論0 收藏0
  • Python Closure

    摘要:在計算機科學中,閉包又稱詞法閉包或函數閉包,是引用了自由變量的函數。閉包被廣泛應用于函數式語言中。運用閉包可以避免對全局變量的使用。將棧頂的元素取出,創建元組,并將該元組進棧。 在計算機科學中,閉包 又稱 詞法閉包 或 函數閉包,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。閉包被廣泛應用于函數式語言中。 從上面這段話中可以看出閉...

    n7then 評論0 收藏0
  • JavaScript閉包

    摘要:朋友,這就是閉包的效果。那么函數就是一個閉包,它可以在作用域外被訪問。封閉函數必須返回至少一個內部函數,這樣內部函數才能在私有作用域中形成閉包,并且可以訪問或者修改私有的狀態。的模塊機制中為模塊增加了一級語法支持。 閉包 閉包是什么? 當函數可以記住并訪問所在的詞法作用域時,就產生了閉包,即使函數是在當前詞法作用域之外執行,簡單上講,就是在一個函數中內部的函數。 function fo...

    bluesky 評論0 收藏0
  • PHP 閉包那些事兒

    摘要:注理論上講閉包和匿名函數是不同的概念,不過將其視作相同的概念。匿名函數可以從父作用域繼承變量,而這個父作用域是定義該閉包的函數不一定是調用它的函數。 匿名函數 匿名函數,也叫閉包函數,說白了就是沒有名字的函數,和一般函數結構一樣,只是少了函數名以及最后需要加上分號;。 注:理論上講閉包和匿名函數是不同的概念,不過PHP將其視作相同的概念。 $func = function() { ...

    winterdawn 評論0 收藏0
  • 通過示例學習JavaScript閉包

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

    xingpingz 評論0 收藏0

發表評論

0條評論

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