JavaScript中的閉包介紹
所謂的閉包應(yīng)該是指: 內(nèi)部函數(shù)讀取當(dāng)前函數(shù)以外的變量,即創(chuàng)建時(shí)所處的上下文環(huán)境。
function hello(){
var char = "hello,world";
function print(){
console.log(char);
};
return print();
}
需要注意的是這里的print函數(shù)引用了外部hello函數(shù)的char變量,于是在這里我們能夠返回一個(gè)
hello,world
而這個(gè)功能在某種意義上來說,應(yīng)該是要?dú)w功于作用域。當(dāng)然了,我們沒有辦法直接訪問char,除非是我們聲明這個(gè)變量的時(shí)候出錯(cuò)了。如
function hello(){
char = "hello,world";
function print(){
console.log(char);
};
return print();
}
僅僅是因?yàn)樯倭藗€(gè)var。
在這里hello變成一個(gè)閉包 了。 閉包是一種特殊的對(duì)象。它由兩部分構(gòu)成:函數(shù),以及創(chuàng)建該函數(shù)的環(huán)境。環(huán)境由閉包創(chuàng)建時(shí)在作用域中的任何局部變量組成。
Javscript 閉包與this
需要注意的是讀取this與arguments時(shí),可能是會(huì)出問題的。
function hello(){
this.char = "hello,world";
function output(){
char = "I'm no hello world";
console.log(this.char);
};
return output();
}
當(dāng)然了這個(gè)例子并不夠貼切,so,我們需要一個(gè)額外的例子來解釋這個(gè)問題,下面引用一個(gè)《Javascript高級(jí)程序設(shè)計(jì)》中的一個(gè)例子,來說明這個(gè)問題。
var name = "The window";
var object = {
name: "My Object",
getNameFunc: function(){
return function(){
return this.name;
}
}
};
object.getNameFunc()()
只是這種用法實(shí)在是,而解決方法便是保存一個(gè)臨時(shí)變量that,如之前在《關(guān)于Javascript的this的一些知識(shí)》一文中所說的。
var name = "The window";
var object = {
name: "My Object",
getNameFunc: function(){
var that = this;
return function(){
return that.name;
}
}
};
object.getNameFunc()()
Javscript 閉包與讀寫變量
值得注意的是,如果我們沒有處理好我們的變量時(shí),我們也可以修改這些變量。
function hello(){
var char = "hello,world";
return{
set: function(string){
return char = string;
},
print: function(){
console.log(char)
}
}
}
var say = hello();
say.set('new hello,world')
say.print() // new hello world
Javascript 閉包與性能
引用MDC的說法
如果不是因?yàn)槟承┨厥馊蝿?wù)而需要閉包,在沒有必要的情況下,在其它函數(shù)中創(chuàng)建函數(shù)是不明智的,因?yàn)殚]包對(duì)腳本性能具有負(fù)面影響,包括處理速度和內(nèi)存消耗。
文上還說到。
例如,在創(chuàng)建新的對(duì)象或者類時(shí),方法通常應(yīng)該關(guān)聯(lián)于對(duì)象的原型,而不是定義到對(duì)象的構(gòu)造器中。原因是這將導(dǎo)致每次構(gòu)造器被調(diào)用,方法都會(huì)被重新賦值一次(也就是說,為每一個(gè)對(duì)象的創(chuàng)建)。
相關(guān)文章
javascript代碼實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了javascript代碼實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01JS實(shí)現(xiàn)判斷圖片是否加載完成的方法分析
這篇文章主要介紹了JS實(shí)現(xiàn)判斷圖片是否加載完成的方法,結(jié)合實(shí)例形式分析了javascript常見的圖片加載完成判斷方法與相關(guān)操作技巧,需要的朋友可以參考下2018-07-07原生JS使用Canvas實(shí)現(xiàn)拖拽式繪圖功能
這篇文章主要介紹了原生js實(shí)現(xiàn)Canvas實(shí)現(xiàn)拖拽式繪圖,支持畫筆、線條、箭頭、三角形和圓形等等圖形繪制功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-06-06Bootstrap Paginator分頁插件與ajax相結(jié)合實(shí)現(xiàn)動(dòng)態(tài)無刷新分頁效果
這篇文章主要介紹了Bootstrap Paginator分頁插件與ajax相結(jié)合實(shí)現(xiàn)動(dòng)態(tài)無刷新分頁效果,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-05-05JavaScript 匿名函數(shù)(anonymous function)與閉包(closure)
JavaScript 匿名函數(shù)(anonymous function)與閉包(closure) ,學(xué)習(xí)js的朋友可以參考下。2011-10-10Object.defineProperty()函數(shù)之屬性描述對(duì)象
這篇文章主要介紹了Object.defineProperty()函數(shù)之屬性描述對(duì)象,JavaScript?提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來描述對(duì)象的屬性,控制它的行為,比如該屬性是否可寫、可遍歷等等。這個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)稱為:屬性描述對(duì)象2022-09-09javascript下用ActiveXObject控件替換word書簽,將內(nèi)容導(dǎo)出到word后打印
由于時(shí)間比較緊,沒多的時(shí)候去學(xué)習(xí)研究上述工具包,現(xiàn)在用javascript操作ActiveXObject控件,用替換word模板中的書簽方式解決。2008-06-06