摘要:無論焦點在哪個輸入域上,顯示的都是關于年齡的消息該問題的原因在于賦給是閉包中的匿名函數而不是閉包對象解決這個問題的一種方案是使指向一個新的閉包對象。
閉包定義 對閉包的具體定義有很多種說法,這些說法大體可以分為兩類:
閉包是其詞法上下文中引用了自由變量的函數.
閉包是由函數和其相關的引用環境組合而成的實體.
詞法:變量的作用域是由它在源碼中所處位置決定的.
很多人都覺得閉包是一個很難理解的知識點,其實不然,不管它的定義有多難理解,我們只需自己對它形成一種自己可以理解的定義就可以了,并保證這種自我理解定義的正確性和可行性.
在這里來看,閉包不管他是一個函數還是一個實體,它給我的理解就是一個函數可以訪問當前上下文的環境變量.在這樣看來,不管是函數內部的函數,還是單個定義的函數,有函數的地方就存在閉包.
閉包的特性和好處 閉包的特性:函數內部可以引用外部的參數和變量.
參數和變量不會被垃圾回收機制回收.
使用閉包的好處希望一個變量長期保存在內存中
可以擁有私有成員
在函數內部存在函數形式的閉包中,可以避免全局變量的污染
舉例 函數內部函數function init() { var name = "closure"; function displayName() { alert(name); } displayName(); } init();
函數 init() 創建了一個局部變量 name,然后定義了名為 displayName() 的函數。 displayName() 是一個內部函數——定義于 init() 之內且僅在該函數體內可用。displayName() 沒有任何自己的局部變量,然而它可以訪問到外部函數的變量,即可以使用父函數中聲明的 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 */
請注意兩個計數器是如何維護它們各自的獨立性的。每次調用 makeCounter() 函數期間,其環境是不同的。每次調用中, privateCounter 中含有不同的實例。
這種形式的閉包提供了許多通常由面向對象編U所享有的益處,尤其是數據隱藏和封裝。
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();
運行這段代碼后,您會發現它沒有達到想要的效果。無論焦點在哪個輸入域上,顯示的都是關于年齡的消息,
該問題的原因在于賦給 onfocus 是閉包(setupHelp)中的匿名函數而不是閉包對象;
解決這個問題的一種方案是使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();性能考量
如果不是因為某些特殊任務而需要閉包,在沒有必要的情況下,在其它函數中創建函數是不明智的,因為閉包對腳本性能具有負面影響,包括處理速度和內存消耗。
例如,在創建新的對象或者類時,方法通常應該關聯于對象的原型,而不是定義到對象的構造器中。原因是這將導致每次構造器被調用,方法都會被重新賦值一次(也就是說,為每一個對象的創建)。
考慮以下雖然不切實際但卻說明問題的示例:
function MyObject(name, message) { this.name = name.toString(); this.message = message.toString(); this.getName = function() { return this.name; }; this.getMessage = function() { return this.message; }; }
上面的代碼并未利用到閉包的益處,因此,應該修改為如下常規形式:
function MyObject(name, message) { this.name = name.toString(); this.message = message.toString(); } MyObject.prototype = { getName: function() { return this.name; }, getMessage: function() { return this.message; } };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/85971.html
摘要:大名鼎鼎的閉包面試必問。閉包的作用是什么。看到閉包在哪了嗎閉包到底是什么五年前,我也被這個問題困擾,于是去搜了并總結下來。關于閉包的謠言閉包會造成內存泄露錯。閉包里面的變量明明就是我們需要的變量,憑什么說是內存泄露這個謠言是如何來的因為。 本文為饑人谷講師方方原創文章,首發于 前端學習指南。 大名鼎鼎的閉包!面試必問。請用自己的話簡述 什么是「閉包」。 「閉包」的作用是什么。 首先...
摘要:一什么是閉包閉包是指有權訪問另一個函數作用域中的變量的函數。就是創建了一個匿名函數調用函數解除對匿名函數的引用,以便釋放內存 一、什么是閉包? 閉包是指有權訪問另一個函數作用域中的變量的函數。創建閉包的常見方式就是在一個函數內部創建另一個函數。 二、為什么要閉包 說明:變量分為全局變量的局部變量,全局變量的作用域為全局作用域,局部變量作用域為局部作用域。之前一篇文章關于作用域鏈給了介紹...
摘要:到底什么是閉包這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。上面這么說閉包是一種特殊的對象。閉包的注意事項通常,函數的作用域及其所有變量都會在函數執行結束后被銷毀。從而使用閉包模塊化代碼,減少全局變量的污染。 閉包,有人說它是一種設計理念,有人說所有的函數都是閉包。到底什么是閉包?這個問題在面試是時候經常都會被問,很多小白一聽就懵逼了,不知道如何回答好。這個...
摘要:寫在前面本文嘗試模仿的風格,介紹的閉包。本文同時也是我學習閉包的一次總結。注根據這篇文章,事實上所有函數在創建的時候都會形成閉包。但這種閉包并沒什么趣味,也沒什么特別的用途,所以我們更關注的是由內部函數形成的閉包。 寫在前面 本文嘗試模仿 The Little Schema 的風格,介紹 JavaScript 的閉包。本文同時也是我學習 JavaScript 閉包的一次總結。歡迎一起討...
摘要:什么是閉包閉包的優缺點閉包是的一大難點,也是它的特色。閉包的用途閉包可以用在許多地方。閉包會在父函數外部,改變父函數內部變量的值。 什么是閉包?閉包的優缺點? 閉包(closure)是javascript的一大難點,也是它的特色。很多高級應用都要依靠閉包來實現。 1、變量作用域 要理解閉包,首先要理解javascript的特殊的變量作用域。變量的作用域無非就兩種:全局變量和局部變量。...
閱讀 2914·2021-10-19 10:09
閱讀 3134·2021-10-09 09:41
閱讀 3380·2021-09-26 09:47
閱讀 2696·2019-08-30 15:56
閱讀 599·2019-08-29 17:04
閱讀 986·2019-08-26 11:58
閱讀 2510·2019-08-26 11:51
閱讀 3361·2019-08-26 11:29