摘要:變量按照作用范圍可以分為全局變量和局部變量。全局變量或者又或者局部變量或者在頁面中全局變量屬于對象。全局和局部變量即便名稱相同,它們也是兩個不同的變量。這些變量是局部變量,作用域是局部性的函數的參數也是局部性的,只在函數內部起作用。
前言:
參考文檔http://www.runoob.com/js/js-f...
問:為什么有它?
答:因為私有變量。
JavaScript變量按照作用范圍可以分為全局變量和局部變量。
私有變量需要用閉包。
全局變量:
var a = 4; function myFunction() { return a * a; }
或者:
a = 4; function myFunction() { return a * a; }
又或者:
function myFunction() { a = 4; return a * a; }
局部變量:
function myFunction() { var a = 4; return a * a; }
或者:
function myFunction(a) { return a * a; }
在web頁面中全局變量屬于window對象。
局部變量只能用于定義它的函數內部。
全局和局部變量即便名稱相同,它們也是兩個不同的變量。修改其中一個,不會影響另一個的值。
注意: 變量聲明是如果不使用 var 關鍵字,那么它就是一個全局變量,即便它在函數內定義。
變量生命周期:
全局變量的作用域是全局性的,即在整個JavaScript程序中,全局變量處處都在。
而在函數內部聲明的變量,只在函數內部起作用。這些變量是局部變量,作用域是局部性的;函數的參數也是局部性的,只在函數內部起作用。
實例解析閉包:
還是以計數器為例。簡單易懂。
var counter = 0; function add() { counter += 1; } add(); add(); add(); // 計數器現在為 3
這里的counter是全局變量,容易被其他地方不小心修改了值。這時再試試局部變量:
function add() { var counter = 0; counter += 1; } add(); add(); add(); // 本意是想輸出 3, 但事與愿違,輸出的都是 1 !
JavaScript內嵌函數可以解決該問題。但還是存在另一個問題,就是每次執行這個函數里的counter=0這個賦值操作都會被執行一次。
就是說返回的結果還是1。
function add() { var counter = 0; function plus() {counter += 1;} plus(); return counter; } var a = add(); console.log(a); var b = add(); console.log(b);
所以還需要處理這個問題,就是確保counter=0只執行一次。這時需要閉包。
JavaScript閉包:
這里還會用到函數自我調用。因為它只執行一次。
var add = (function () { var counter = 0; return function () {return counter += 1;} })(); add(); add(); add(); // 計數器為 3
實例解析:
變量add指定了函數自我調用的返回字值。
自我調用函數只執行一次。設置計數器為 0。并返回函數表達式。
add變量可以作為一個函數使用。非常棒的部分是它可以訪問函數上一層作用域的計數器。
這個叫作 JavaScript閉包。它使得函數擁有私有變量變成可能。
計數器受匿名函數的作用域保護,只能通過add方法修改。
注意: 閉包是可訪問上一層函數作用域里變量的函數,即便上一層函數已經關閉。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81493.html
摘要:也許最好的理解是閉包總是在進入某個函數的時候被創建,而局部變量是被加入到這個閉包中。在函數內部的函數的內部聲明函數是可以的可以獲得不止一個層級的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請自行忽略。 譯者 :文章寫在2006年,可直到翻譯的21小時之前作者還在完善這篇文章,在Stackoverflow的How do Java...
摘要:但是閉包也不是什么復雜到不可理解的東西,簡而言之,閉包就是閉包就是函數的局部變量集合,只是這些局部變量在函數返回后會繼續存在。可惜的是,并沒有提供相關的成員和方法來訪問閉包中的局部變量。 (收藏自 技術狂) 前言:還是一篇入門文章。Javascript中有幾個非常重要的語言特性——對象、原型繼承、閉包。其中閉包 對于那些使用傳統靜態語言C/C++的程序員來說是一個新的語言特性。本文將...
摘要:當在中調用匿名函數時,它們用的都是同一個閉包,而且在這個閉包中使用了和的當前值的值為因為循環已經結束,的值為。最好將閉包當作是一個函數的入口創建的,而局部變量是被添加進這個閉包的。 閉包不是魔法 這篇文章使用一些簡單的代碼例子來解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實只要理解了核心概念,閉包并不是那么的難于理解。但是,網上充斥了太多學術性的文章,對于...
摘要:深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經典的閉包題。定義對閉包的定義為閉包是指那些能夠訪問自由變量的函數。 JavaScript深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經典的閉包題。 定義 MDN 對閉包的定義為: 閉包是指那些能夠訪問自由變量的函數。 那什么是自由變量呢? 自由變量是指在函數中使用的,但既不是函數參數也...
摘要:一言以蔽之,閉包,你就得掌握。當函數記住并訪問所在的詞法作用域,閉包就產生了。所以閉包才會得以實現。從技術上講,這就是閉包。執行后,他的內部作用域并不會消失,函數依然保持有作用域的閉包。 網上總結閉包的文章已經爛大街了,不敢說筆者這篇文章多么多么xxx,只是個人理解總結。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結與《JavaScript忍者秘籍》 《你不知道的JavaScri...
摘要:但是,必須強調,閉包是一個運行期概念。通過原型鏈可以實現繼承,而與閉包相關的就是作用域鏈。常理來說,一個函數執行完畢,其執行環境的作用域鏈會被銷毀。所以此時,的作用域鏈雖然銷毀了,但是其活動對象仍在內存中。 學習Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
閱讀 3117·2021-11-24 09:39
閱讀 979·2021-09-07 10:20
閱讀 2400·2021-08-23 09:45
閱讀 2273·2021-08-05 10:00
閱讀 575·2019-08-29 16:36
閱讀 840·2019-08-29 11:12
閱讀 2824·2019-08-26 11:34
閱讀 1844·2019-08-26 10:56