關於閉包的理解

2022-04-02 17:22:44 字數 1413 閱讀 1591

發表一下關於閉包的理解:

首先把每乙個函式看成乙個乙個的「小黑屋」小黑屋裡面可以看到外面的東西,但外面卻看不到小黑屋裡面的東西,就好比是函式可以訪問外面全域性變數,但是外面卻訪問不了「小黑屋」裡面的變數;變數分為全域性變數和區域性變數;

列:函式可以訪問外面全域性變數

var a=1;

function fun1()

fun1(); // 1

列:外面卻訪問不了「小黑屋」裡面的變數

function fun2()

alert(a); // a is not defined

但是如果想取到「小黑屋」內部的變數怎麼辦呢?自然一種叫閉包的東西出來了。

閉包就是可以訪問函式內部變數的函式;

閉包就是函式內部巢狀函式,裡層函式就叫閉包;

再說一下鏈式作用域:子函式中可以訪問父函式的所有變數。當然也包括全域性變數window(一般的函式定義function a(){},其實都是window物件的子函式)

開始舉例:因為有鏈式作用域fun2可以獲取到fun1的變數a,所以把fun2當做fun1的返回值不就相當於在最外面可以獲取到fun1內部的東西了嗎,(記住你的初衷是想獲取fun1」小黑屋」內部的東西才引入的fun2)

alert出了fun1的返回值是乙個函式再次執行返回的函式即fun1()()

你最初的想法是想獲取小黑屋裡面的a但一般是不可以的,用了閉包發現可以了,這就是閉包的作用。閉包還有乙個作用因為他可以把函式內部的東西變為全域性的東西,不讓垃圾**機制**a一直在記憶體中存在,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題;

測試一下自己吧:

var name = "the window";

var object = ;

}

};

alert(object.getnamefunc()());

知道輸出結果嗎?不知道的跟我一步一步來分析吧,首先是定義了乙個叫name的字串,和定義了乙個object物件,物件裡面有兩個屬性name和getnamefunc,而getnamefunc後面就是咱們之前說的閉包(內外層函式巢狀),這可以看明白吧,object.getnamefunc()()的意思就是上面例子的fun1()(),至於內層函式的this是指向window的即window.name即正確答案是"the window"; 如果你答案是"my object"那應該題目是this.object.name,

參考借鑑:

關於閉包的理解

js複習決定把閉包這個特性好好研究清楚 閉包是一種函式特性把,函式包含子函式,通過子函式訪問自身變數,然後在講子函式返回,達到普通函式做不到的特性 普通函式可以訪問全域性變數,但是不能訪問其他函式的變數 var n 1 function f1 f1 1 function f2 f2 b is not...

關於閉包的理解

閉包官方定義 閉包是指程式中有許多變數和繫結變數的執行環境。本人自己理解 程式的 段允許存在一級函式並且一級函式不能被釋放,一級函式沒有釋放之前,外部可以使用一級函式的區域性變數。進一步理解 閉包就是外部可以使用區域性變數。閉包的功能 1 外部可以使用區域性變數。2 使函式不能釋放。閉包的缺點 外部...

關於JS閉包的理解

閉包要解決的問題是 乙個函式可以擁有私有變數,並且外部可以通過閉包訪問該私有變數 閉包是一種保護私有變數的機制,在函式執行時形成私有的作用域,保護裡面的私有變數不受外界干擾。直觀的說就是形成乙個不銷毀的棧環境。計數器例項 區域性變數計數。p button onclick myfunction 1 b...