摘要:而函數(shù)被當作某個對象的方法調(diào)用時也就是非匿名函數(shù),指的是那個對象。但是,匿名函數(shù)的作用域是全局的。不過可以把的外部函數(shù)的保存在一個變量中,的匿名函數(shù)調(diào)用這個變量代替。
什么是閉包?
簡而言之,閉包就是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù),并且讓這些變量的值始終保持在內(nèi)存中。
常用的創(chuàng)建方法是在一個函數(shù)的內(nèi)部創(chuàng)建另一個函數(shù)。like:
function num1(){ var n = 0; add = function(){ n++; } function num2(){ console.log(n); } return num2; } var result = num1(); result(); // 0 add(); result(); // 1
第一次result()的結(jié)果是0,第二次是1,因為num2是num1的子函數(shù),它被賦予全局變量,因此會一直占用內(nèi)存,而num2的內(nèi)存依賴于num1,因此num1也一直占用內(nèi)存。不會把第一次得到的n放入垃圾回收機制。
另外add沒有用var聲明,因此它屬于全局變量。
由于閉包會攜帶包含它的的函數(shù)的作用域,因此會比其他函數(shù)占據(jù)更多的內(nèi)存,所以為了性能,要慎用閉包。
垃圾回收機制在這里提一下上文說到的垃圾回收機制,原理很簡單:找出那些不再繼續(xù)使用的變量,釋放其占用的內(nèi)存。垃圾回收機制會按照固定的時間間隔,周期性地執(zhí)行操作。
this對象在全局函數(shù)中,this等于window。而函數(shù)被當作某個對象的方法調(diào)用時(也就是非匿名函數(shù)),this指的是那個對象。但是,匿名函數(shù)的作用域是全局的。因此匿名函數(shù)的this指的是window。
比如下面這個例子:
var name="sara"; var names={ name:"Aom", sayName:function(){ return function(){ return this.name }; } }; alert(names.sayName()()); //"sara"
sayName()返回的是一個匿名函數(shù),匿名函數(shù)的作用域是全局的,因此this.name返回的是sara。
不過可以把sayName的外部函數(shù)的this保存在一個變量中,sayName的匿名函數(shù)調(diào)用這個變量代替this。就可以返回到外部函數(shù)的name。
實現(xiàn)如下:
var name="sara"; var names={ name:"Aom", sayName:function(){ var self = this; return function(){ return this.name }; } }; alert(names.sayName()()); //"Aom"
this得值在幾種特殊情況下也會改變。
var name="sara"; var names={ name:"Aom", sayName:function(){ return this.name } }; names.sayName();//"Aom" (names.sayName)();//"Aom" (names.sayName = names.sayName)();//"sara"
第一種情況很簡單,在這里就不做解釋;第二種情況,因為(names.sayName)和names.sayName定義是相同的,所以結(jié)果是"Aom";第三種情況,括號內(nèi)進行的賦值是sayName函數(shù)本身,并不會附帶賦值names的其他內(nèi)容,因此this發(fā)生了改變,取得window,結(jié)果為sara。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81610.html
摘要:深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對閉包的定義為閉包是指那些能夠訪問自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對閉包的定義為: 閉包是指那些能夠訪問自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...
摘要:而閉包的妙處在于,當函數(shù)在執(zhí)行完畢后它的活動對象不會被銷毀,因為匿名函數(shù)的作用域鏈仍然在引用函數(shù)的活動對象它的作用域鏈會被銷毀。 一、閉包 閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常用方式是,在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。 請看以下代碼:我們在createComparisonFunction函數(shù)里創(chuàng)建了一個閉包 function createComparisonFun...
摘要:不過匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對象通常指向。在閉包中使用對象可能會導(dǎo)致一些問題。這個對象還包含一個方法它返回一個匿名函數(shù),而匿名函數(shù)又返回,這個匿名函數(shù)就是閉包。偽代碼過程在定義匿名函數(shù)之前,把對象賦值給了一個名叫的變量。 this對象 前言:最近在細讀Javascript高級程序設(shè)計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏...
摘要:使用上一篇文章的例子來說明下自由變量進階期深入淺出圖解作用域鏈和閉包訪問外部的今天是今天是其中既不是參數(shù),也不是局部變量,所以是自由變量。 (關(guān)注福利,關(guān)注本公眾號回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導(dǎo)) 本周正式開始前端進階的第二期,本周的主題是作用域閉包,今天是第7天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了解本進階計...
摘要:以上描述,全部符合閉包的描述,那這就是閉包。二執(zhí)行過程之前的文章講了函數(shù)的執(zhí)行上下文棧,變量對象,作用域鏈等內(nèi)容,接下來通過閉包代碼回顧代碼是怎么樣的執(zhí)行過程。將活動對象壓入作用域鏈頂端。函數(shù)執(zhí)行結(jié)束,彈出執(zhí)行上下文棧。 本文一共 1300 字,讀完只需 5 分鐘 概述 閉包, 可以說是每個前端工程師都聽說的一個詞,咋一看很難從字面上去理解,從而給人留下了閉包是一個重要又難以理解的...
閱讀 1834·2023-04-26 02:51
閱讀 2867·2021-09-10 10:50
閱讀 3068·2021-09-01 10:48
閱讀 3633·2019-08-30 15:53
閱讀 1828·2019-08-29 18:40
閱讀 415·2019-08-29 16:16
閱讀 2039·2019-08-29 13:21
閱讀 1825·2019-08-29 11:07