摘要:函數(shù)是中唯一擁有自身作用域的結(jié)構(gòu),因此閉包的創(chuàng)建依賴于函數(shù)。閉包中的匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對(duì)象通常指向在通過(guò)或改變函數(shù)執(zhí)行環(huán)境的情況下,就會(huì)指向其他對(duì)象。當(dāng)匿名函數(shù)執(zhí)行完畢,其作用域鏈立即銷毀,從而可以減少閉包占用資源問(wèn)題。
概念
??閉包是指能夠引用外部函數(shù)中的局部變量的函數(shù),并導(dǎo)致外部函數(shù)調(diào)用后函數(shù)對(duì)象與局部變量無(wú)法及時(shí)銷毀。函數(shù)是JavaScript中唯一擁有自身作用域的結(jié)構(gòu),因此閉包的創(chuàng)建依賴于函數(shù)。
var Foo = function() { var name = "staven"; this.getName = function() { return name; }; }; var foo = new Foo(); console.log(foo.name); //undefined console.log(foo.getName()); //staven閉包中的循環(huán)
?? 作用域鏈的這種配置機(jī)制引出了一個(gè)值得注意的副作用,即閉包只能取得包含函數(shù)中任何變量的最后一個(gè)值。
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); //10次輸出10 }, 1000); }
??為了正確的獲得循環(huán)序號(hào),最好使用自執(zhí)行匿名函數(shù)。
for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { console.log(e); }, 1000); })(i); }閉包中的this
??匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對(duì)象通常指向 window(在通過(guò) call()或 apply()改變函數(shù)執(zhí)行環(huán)境的情況下, this 就會(huì)指向其他對(duì)象)。
var name = "全局"; var obj = { name: "局部", getName: function(){ var that = this; return function(){ return that.name; } } }; console.log(obj.getName()()); //局部
??把外部作用域中的 this 對(duì)象保存在一個(gè)閉包能夠訪問(wèn)到的變量里,就可以讓閉包訪問(wèn)該對(duì)象了。
var name = "全局"; var obj = { name: "局部", getName: function() { var that = this; return function() { return that.name; }; } }; console.log(obj.getName()()); //"局部"閉包的作用
??只要我們臨時(shí)需要一些變量,都可以使用塊級(jí)作用域(私有作用域)。當(dāng)匿名函數(shù)執(zhí)行完畢,其作用域鏈立即銷毀,從而可以減少閉包占用資源問(wèn)題。
(function($, window, document, undefined){ var name = "staven"; $.fn.getName = function(){ }; })(jQuery, window, document);
??緩存數(shù)據(jù)、柯里化
//利用閉包實(shí)現(xiàn) var Book = (function(){ //靜態(tài)私有變量 var bookNum = 0; //靜態(tài)私有方法 function checkBook(name){ console.log("checking Book……"); } //創(chuàng)建類 function _book(newId, newName, newPrice){ if(this instanceof _book){ //私有變量 var name, price; //私有方法 function checkID(id){ console.log("checking id……"); } //特權(quán)方法 this.getName = function(){}; this.getPrice = function(){}; this.setName = function(){}; this.setPrice = function(){}; //公有屬性 this.id = newId; //公有方法 this.copy = function() { console.log("copying……") }; bookNum++; if(bookNum > 100){ throw new Error("我們僅出版100本書"); } //構(gòu)造器 this.setName(name); this.setPrice(price); }else{ return new _book(newId, newName, newPrice); } } //構(gòu)建原型 _book.prototype = { //靜態(tài)共有屬性 isJSBook:false, //靜態(tài)共有方法 show:function(){ console.log("showing……"); } }; //返回類 return _book; })(); Book(21,"staven",23).show(); //showing…… Book(21,"staven",23).copy(); //copy…… var book = new Book(21,"staven",23); book.show(); //showing…… book.copy(); //copying……
??由于閉包會(huì)攜帶包含它的函數(shù)的作用域,因此會(huì)比其他函數(shù)占用更多的內(nèi)存。過(guò)度使用閉包可能會(huì)導(dǎo)致內(nèi)存占用過(guò)多,建議只在絕對(duì)必要時(shí)再考慮使用閉包。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86833.html
摘要:事件循環(huán)了解知識(shí)點(diǎn)線程執(zhí)行棧線程是單線程的語(yǔ)言可以單線程將理解為只有一條車道在車道里后面的車在等前面的車通過(guò)后才能通過(guò)即當(dāng)前面的程序沒(méi)有執(zhí)行后面的程序也不能執(zhí)行執(zhí)行棧執(zhí)行棧像車道被執(zhí)行的程序會(huì)放入執(zhí)行棧里但它的執(zhí)行的順序是后面進(jìn)來(lái)的程序先執(zhí) 事件循環(huán) 了解知識(shí)點(diǎn) 線程 執(zhí)行棧 task queue web api macro task micro task 線程 javascrip...
摘要:寫在前面深入系列共計(jì)篇已經(jīng)正式完結(jié),這是一個(gè)旨在幫助大家,其實(shí)也是幫助自己捋順底層知識(shí)的系列。深入系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點(diǎn)贊,鼓勵(lì)指正。 寫在前面 JavaScript 深入系列共計(jì) 15 篇已經(jīng)正式完結(jié),這是一個(gè)旨在幫助大家,其實(shí)也是幫助自己捋順 JavaScript 底層知識(shí)的系列。重點(diǎn)講解了如原型、作用域、執(zhí)行上下文、變量對(duì)象、this、...
摘要:然后將構(gòu)造函數(shù)的原型設(shè)為,便實(shí)現(xiàn)了對(duì)象繼承。首先,我們定義一個(gè)構(gòu)造函數(shù),并在其中定義一個(gè)局部變量。這里的是局部變量,其作用域仍然存在是閉包現(xiàn)象,而非對(duì)象屬性。 Javascript是動(dòng)態(tài)的,弱類型的,解釋執(zhí)行的程序設(shè)計(jì)語(yǔ)言。 Javascript極其靈活,支持多種程序設(shè)計(jì)范式:面向?qū)ο蟆⒅噶钍健⒑瘮?shù)式。JavaSCript最初被用于瀏覽器腳本,現(xiàn)在已經(jīng)是所有主流瀏覽器的默認(rèn)腳本語(yǔ)言。瀏...
摘要:在標(biāo)簽中添加屬性,本質(zhì)上是跟在標(biāo)簽里面寫屬性時(shí)一樣的,所以屬性值最終都會(huì)編譯為字符串類型。這個(gè)節(jié)點(diǎn)包括很多,比如,以及一些方法等方法。一個(gè)對(duì)象有很多,該集合名字為,里面有其他以及,里面有很多。 一、變量類型和計(jì)算 JS中使用typeof能得到哪些類型 變量類型 值類型:變量本身就是含有賦予給它的數(shù)值的,它的變量本身及保存的數(shù)據(jù)都存儲(chǔ)在棧的內(nèi)存塊當(dāng)中 引用類型:引用類型當(dāng)然是分配到...
摘要:在操作對(duì)象時(shí),實(shí)際上是在操作對(duì)象的引用而不是實(shí)際的對(duì)象。任一變量值操作互不影響。訪問(wèn)變量有按值和按引用兩種方式,而參數(shù)只能按值傳遞。基本類型參數(shù)傳遞傳給函數(shù)的是數(shù)值的一個(gè)復(fù)制,函數(shù)中對(duì)其的修改外部不可見(jiàn)。 ?? ECMAScript 變量可能包含兩種不同數(shù)據(jù)類型的值:基本類型值和引用類型值。 基本類型值指的是簡(jiǎn)單的數(shù)據(jù)段,而引用類型值指那些可能由多個(gè)值構(gòu)成的對(duì)象。 ??5 種基本數(shù)據(jù)類...
閱讀 3495·2021-11-24 11:17
閱讀 2281·2021-11-15 11:38
閱讀 3368·2021-10-14 09:42
閱讀 2930·2019-08-30 15:54
閱讀 2024·2019-08-28 18:09
閱讀 539·2019-08-26 11:48
閱讀 1633·2019-08-26 10:48
閱讀 2147·2019-08-26 10:45