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