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