摘要:我們可以用普通函數內部嵌套匿名函數,形成一個閉包來使變量駐留在內存中。局部變量閉包為什么要將賦值給變量呢這里我們就要談到匿名函數調用問題匿名函數如何調用還是上面的例子會將整個函數體打印出來這樣才調用了函數內部的匿名函數看到這里。
閉包含義:
閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的常見的方式,就是在
一個函數內部創建另一個函數,通過另一個函數訪問這個函數的局部變量。
這個時候我們就要談到匿名函數了.
匿名函數
匿名函數就是沒有名字的函數,閉包是可訪問一個函數作用域里變量的函數。看例子:
function box () { //這是一個普通函數 return "anonymous"; } alert(box());
那么匿名函數是什么呢?看例子:
function () { return "anonymous"; }
這個函數并沒有執行!!!
如果讓匿名函數執行呢。我們可以將匿名函數賦值給一個變量:
var box = function (){ return "anonymous"; }; alert(box()); //anonymous
但是這種表達式有時候并沒有什么含義,那我們可以用自執行的方法去調用匿名函數:
(function () { alert("anonymous"); })();
匿名函數如何傳參呢?看例子:
(function (a) { alert(a); })(100); //alert返回100匿名函數和閉包的作用
談到閉包,我們就不得不談到全局變量和局部變量。
全局變量:
全局變量在實際寫項目中個人額不建議使用,因為大量的全局變量會污染代碼,每個模塊都可以去地道用,必將引來很多錯誤。所以推薦變量私有化。
什么是變量私有化?
var a = 100; //全局變量 function box () { alert(a); } box(); //調用函數返回100
通過上面的代碼可以看出,每個函數內都可以調用外部的局部變量。將a變量變成了公有化的變量,有時候我們并不希望這么做。所以我們可以將變量定義在函數內部使變量變成私有化變量,外部無法訪問到這個變量
function box () { var a = 100; //局部變量 } alert(a); //a is not defined
這就完事了么?并沒有!!記住一點:局部變量在每次調用時都會初始化!!!(重要的事情用三個感嘆號...)
我們來用一個后置遞增的一個小例子來告訴大家:
function a () { var b = 100; b++; return b; } alert(a()); //101 alert(a()); //101
不難看出,每次調用,變量b都會被初始化,所以每次調用都會返回101而不是累加。我們可以用普通函數內部嵌套匿名函數,形成一個閉包來使變量駐留在內存中。
function a () { var b = 100; //局部變量 return function () { //閉包 b++; return b; }; } var c = a(); alert(c()); //101 alert(c()); //102
為什么要將a()賦值給變量c呢?這里我們就要談到匿名函數調用問題:
匿名函數如何調用?還是上面的例子:
function a () { var b = 100; return function () { return b; }; } alert(a()); //會將整個函數體打印出來 alert(a()()); //這樣才調用了函數內部的匿名函數
看到這里。大家應該理解了為什么要將a()賦值給c變量了吧?因為如果直接使用a()();這樣去調用,每次調用還是會初始化局部變量,而我們賦值給變量c,外層函數被調用了一次賦值給了C,而每次調用C去調用內部的匿名函數,從而達到了閉包。
我會在下一章繼續講閉包,歡迎大家來糾正錯誤及指正!
Brian Lee
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80986.html
摘要:關于循環和閉包當循環和閉包結合在一起時,經常會產生讓初學者覺得匪夷所思的問題。閉包是一把雙刃劍是比較難以理解和掌握的部分,它十分強大,卻也有很大的缺陷,如何使用它完全取決于你自己。 在談閉包之前,我們首先要了解幾個概念: 什么是函數表達式? 與函數聲明有何不同? JavaScript查找標識符的機制 JavaScript的作用域是詞法作用域 JavaScript的垃圾回收機制 先來...
摘要:在內部,理所當然能訪問到局部變量,但當作為的返回值賦給外的全局變量時,神奇的事情發生了在全局作用域中訪問到了,這就是閉包。而閉包最神奇的地方就是能在一個函數外訪問函數中的局部變量,把這些變量用閉包的形式放在函數中便能避免污染。 一、閉包是什么? 《JavaScript高級程序設計》中寫道:閉包是指有權訪問另一個函數作用域中的變量的函數,如果用下定義的觀點看,這句話就是說閉包是函數,我...
摘要:將作用域賦值給變量這里的作用域是,而不是將作用域賦值給一個變量閉包返回瀏覽器中內存泄漏問題大家都知道,閉包會使變量駐留在內存中,這也就導致了內存泄漏。 上一章我們講了匿名函數和閉包,這次我們來談談閉包中作用域this的問題。 大家都知道,this對象是在運行時基于函數的執行環境綁定的,如果this在全局就是[object window],如果在對象內部就是指向這個對象,而閉包卻是在運行...
摘要:接上回我寫了一篇關于閉包的博客學習之閉包,最后談到閉包導致的問題時留了一個尾在以下的瀏覽器中會有內存泄漏的問題。今天的博客就繼續探索一下內存泄漏的問題。博客地址的前端之路原文鏈接學習之內存泄漏 接上回我寫了一篇關于閉包的博客《學習JavaScript之閉包》, 最后談到閉包導致的問題時留了一個尾: 在IE9以下的瀏覽器中會有內存泄漏的問題。 今天的博客就繼續探索一下內存泄漏的問題。 淺...
閱讀 1029·2023-04-26 02:26
閱讀 2134·2021-09-26 10:16
閱讀 1544·2019-08-30 12:57
閱讀 3461·2019-08-29 16:10
閱讀 3214·2019-08-29 13:47
閱讀 1182·2019-08-29 13:12
閱讀 2135·2019-08-29 11:11
閱讀 1330·2019-08-26 13:28