摘要:由于閉包函數是由調用的,所以一般它的指向。因為閉包記住了它定義時候的作用域呀,這個時候的是塊級的,能夠好好地保存起來被閉包函數使用。
定義
當函數可以記住并訪問它定義時候的作用域,就產生了閉包。也就是說,一個函數在另外一個函數里面定義,但是它執行的時候,可能是在其他的作用域,但是它還是能夠憑著出生時的回憶,找到定義時的作用域,去訪問里面的變量。
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中的閉包不是一個一說就能明白的概念,但是隨著你往學習的深入,無論如何你都需要去了解這么一個東西。 閉包的概念 我們嘗試從概念上去理解一下閉包。 在一些語言中,在函數中可以(嵌...
摘要:完美的閉包,對,閉包就這么簡單。這僅僅是閉包的一部分,閉包利用函數作用域達到了訪問外層變量的目的。此時一個完整的閉包實現了,的垃圾回收機制由于閉包的存在無法銷毀變量。 1.閉包是指有權訪問另一個函數作用域中的變量的函數。 上面這段話來自 javascript 高級程序設計 第三版 P178 。作者說閉包是一個函數,它有訪問另一個函數作用域中的變量的能力。 2.函數訪問它被創建時所處的...
摘要:在計算機科學中,閉包又稱詞法閉包或函數閉包,是引用了自由變量的函數。閉包被廣泛應用于函數式語言中。運用閉包可以避免對全局變量的使用。將棧頂的元素取出,創建元組,并將該元組進棧。 在計算機科學中,閉包 又稱 詞法閉包 或 函數閉包,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。閉包被廣泛應用于函數式語言中。 從上面這段話中可以看出閉...
摘要:朋友,這就是閉包的效果。那么函數就是一個閉包,它可以在作用域外被訪問。封閉函數必須返回至少一個內部函數,這樣內部函數才能在私有作用域中形成閉包,并且可以訪問或者修改私有的狀態。的模塊機制中為模塊增加了一級語法支持。 閉包 閉包是什么? 當函數可以記住并訪問所在的詞法作用域時,就產生了閉包,即使函數是在當前詞法作用域之外執行,簡單上講,就是在一個函數中內部的函數。 function fo...
摘要:注理論上講閉包和匿名函數是不同的概念,不過將其視作相同的概念。匿名函數可以從父作用域繼承變量,而這個父作用域是定義該閉包的函數不一定是調用它的函數。 匿名函數 匿名函數,也叫閉包函數,說白了就是沒有名字的函數,和一般函數結構一樣,只是少了函數名以及最后需要加上分號;。 注:理論上講閉包和匿名函數是不同的概念,不過PHP將其視作相同的概念。 $func = function() { ...
摘要:譯者按在上一篇博客,我們通過實現一個計數器,了解了如何使用閉包,這篇博客將提供一些代碼示例,幫助大家理解閉包。然而,如果通過代碼示例去理解閉包,則簡單很多。不過,將閉包簡單地看做局部變量,理解起來會更加簡單。 - 譯者按: 在上一篇博客,我們通過實現一個計數器,了解了如何使用閉包(Closure),這篇博客將提供一些代碼示例,幫助大家理解閉包。 原文: JavaScript Clos...
閱讀 1599·2021-09-02 15:41
閱讀 1002·2021-09-02 15:11
閱讀 1285·2021-07-28 00:15
閱讀 2312·2019-08-30 15:55
閱讀 1148·2019-08-30 15:54
閱讀 1696·2019-08-30 15:54
閱讀 2979·2019-08-30 14:02
閱讀 2529·2019-08-29 16:57