摘要:如果不用的話,你實際上聲明了一個全局變量閉包有權訪問另一個函數作用域的變量,常見的創建方式就是在一個函數內部創建另一個函數,通過另一個函數訪問這個函數的局部變量。
變量作用域
變量的作用域無非就是兩種:全局變量和局部變量。
函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明了一個全局變量!
閉包有權訪問另一個函數作用域的變量,常見的創建方式就是在一個函數內部創建另一個函數,通過另一個函數訪問這個函數的局部變量。
簡單的說就是,閉包就是能夠讀取其他函數內部變量的函數。
由于在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。
MDN中定義的是:
閉包是指能夠訪問自由變量的函數。換句話說,在閉包中定義的函數可以“記憶”它被創建的環境。注:自由變量是既不是在本地聲明又不作為參數傳遞的一類變量。
簡單的例子
function A(){ function B(){ console.log("Hello Closure!"); } return B; } var b = A(); b();//Hello Closure!
所以通過這個例子可以簡單理解閉包。
* 定義一個函數A() * A中定義了函數B() * A中返回B * 執行A(),把A的返回結果賦值給變量b * 執行b()
總結一句話:函數A的內部函數B被函數A外的一個變量b引用。所以當一個內部函數被其外部函數之外的變量引用時,就形成了一個閉包
閉包的作用在一個模塊中定義一個變量,希望這個變量保存在內存中又不會污染全局變量,就用閉包來定義這個模板。
它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。
閉包的注意點閉包優點,也是缺點,局部變量駐留在內存中,可以回避使用全局變量,但由于閉包里的資源不會被立刻銷毀回收,所以可能占用更多的內存,過度使用閉包會導致性能下降。
閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。
注意:可以使用之后,給它加null,接觸引用。
舉例例子1:
var name = "The Window"; // 全局 var object = { name: "My Object", // 局部 getNameFunc: function () { // 對象中的方法,this指向obj這個對象 return function () { // 閉包 return this.name; // this指向window }; } }; alert(object.getNameFunc()()); // The Window
例子2:
var name = "The Window"; // 全局 var object = { name: "My Object", // 局部 getNameFunc: function () { // 對象中的方法,this指向obj這個對象 var that = this; // 將getNameFunc()的this保存在that變量中 return function () { // 閉包 return that.name; // that指向object }; } }; alert(object.getNameFunc()()); // My Object
例子3:
var name = "The Window"; // 全局 var object = { name: "My Object", // 局部 getNameFunc: function () { return function () { // 閉包 var that = this; return that.name; }; } }; alert(object.getNameFunc()()); // The Window
例子4:
var name = "The Window"; // 全局 var object = { name: "My Object", // 局部 getNameFunc: function () { // 對象中的方法,this指向obj這個對象 return function () { // 閉包 var that = this; // 將getNameFunc()的this保存在that變量中 return that.name; // this指向window }; } }; alert(object.getNameFunc().call(object)); // My Object call改變this指向
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94718.html
摘要:為了更好的講解構造函數原型原型鏈等,我們需要復習一下函數的一些基礎知識。閉包在復習了函數的相關基礎知識之后,我們終于可以進入閉包。我們可以這樣理解閉包,首先,閉包是一個函數,是一個什么樣子的函數呢是一個可以訪問另一個函數中變量的函數。 為了更好的講解構造函數、原型、原型鏈等,我們需要復習一下函數的一些基礎知識。接下來,就讓我們一起回味一些JS的基礎知識點。 全局變量VS局部變量 簡單粗...
摘要:前言這段時間一直在消化作用域鏈和閉包的相關知識。而作用域鏈則是這套規則這套規則的具體運行。是變量對象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當前執行環境對符合訪問權限的變量和函數的有序訪問。 前言:這段時間一直在消化作用域鏈和閉包的相關知識。之前看《JS高程》和一些技術博客,對于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術文章。這也給我的學習上造成了一些困惑,...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內部,也就是說為其聲明的變量隱式的劫持了所在的塊級作用域。 作用域與閉包 如何用js創建10個button標簽,點擊每個按鈕時打印按鈕對應的序號? 看到上述問題,如果你能看出來這個問題實質上是考對作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對作用域已經理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內部,也就是說為其聲明的變量隱式的劫持了所在的塊級作用域。 作用域與閉包 如何用js創建10個button標簽,點擊每個按鈕時打印按鈕對應的序號? 看到上述問題,如果你能看出來這個問題實質上是考對作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對作用域已經理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
閱讀 1629·2019-08-30 15:54
閱讀 2374·2019-08-30 15:52
閱讀 2048·2019-08-29 15:33
閱讀 3042·2019-08-28 17:56
閱讀 3237·2019-08-26 13:54
閱讀 1675·2019-08-26 12:16
閱讀 2449·2019-08-26 11:51
閱讀 1645·2019-08-26 10:26