摘要:這里存在內(nèi)存泄露問題,油畫后的代碼如下這里這里這里這里這里這里
原始代碼:
function Cars(){ this.name = "Benz"; this.color = ["white","black"]; } Cars.prototype.sayColor = function(){ var outer = this; return function(){ return outer.color }; }; var instance = new Cars(); console.log(instance.sayColor()())
優(yōu)化后的代碼:
function Cars(){ this.name = "Benz"; this.color = ["white","black"]; } Cars.prototype.sayColor = function(){ var outerColor = this.color; //保存一個副本到變量中 return function(){ return outerColor; //應用這個副本 }; outColor = null; //釋放內(nèi)存 }; var instance = new Cars(); console.log(instance.sayColor()())
稍微復雜一點的例子:
function inheritPrototype(subType,superType){ var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function Cars(){ this.name = "Benz"; this.color = ["white","black"]; } Cars.prototype.sayColor = function(){ var outer = this; return function(){ return outer.color; }; }; function Car(){ Cars.call(this); this.number = [321,32]; } inheritPrototype(Car,Cars); Car.prototype.sayNumber = function(){ var outer = this; return function(){ return function(){ return outer.number[outer.number.length - 1]; } }; }; var instance = new Car(); console.log(instance.sayNumber()()());
首先,該例子組合使用了構(gòu)造函數(shù)模式和原型模式創(chuàng)建Cars 對象,并用了寄生組合式繼承模式來創(chuàng)建Car 對象并從Cars 對象獲得屬性和方法的繼承;
其次,建立一個名為instance 的Car 對象的實例;instance 實例包含了sayColor 和sayNumber 兩種方法;
最后,兩種方法中,前者使用了一個閉包,后者使用了兩個閉包,并對其this 進行修改使其能夠訪問到this.color 和this.number。
這里存在內(nèi)存泄露問題,油畫后的代碼如下:
function inheritPrototype(subType,superType){ var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function Cars(){ this.name = "Benz"; this.color = ["white","black"]; } Cars.prototype.sayColor = function(){ var outerColor = this.color; //這里 return function(){ return outerColor; //這里 }; this = null; //這里 }; function Car(){ Cars.call(this); this.number = [321,32]; } inheritPrototype(Car,Cars); Car.prototype.sayNumber = function(){ var outerNumber = this.number; //這里 return function(){ return function(){ return outerNumber[outerNumber.length - 1]; //這里 } }; this = null; //這里 }; var instance = new Car(); console.log(instance.sayNumber()()());
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78217.html
摘要:但是在中,的生命還會繼續(xù)。這其中最典型的問題便是批量增加元素。這時,如果構(gòu)造函數(shù)被調(diào)用時沒有參數(shù),則會自動設(shè)置為。因為從系統(tǒng)的角度來說,當你用字符串的時候,它會被傳進構(gòu)造函數(shù),并且重新調(diào)用另一個函數(shù)。 序言 在今天,JavaScript已經(jīng)成為了網(wǎng)頁編輯的核心。尤其是過去的幾年,互聯(lián)網(wǎng)見證了在SPA開發(fā)、圖形處理、交互等方面大量JS庫的出現(xiàn)。 如果初次打交道,很多人會覺得js很簡單...
摘要:解決方式是,當我們不使用它們的時候,手動切斷鏈接淘汰把和對象轉(zhuǎn)為了真正的對象,避免了使用這種垃圾收集策略,消除了以下常見的內(nèi)存泄漏的主要原因。以上參考資料高程垃圾收集類內(nèi)存泄漏及如何避免內(nèi)存泄露及解決方案詳解類內(nèi)存泄漏及如何避免 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1ft1ikzcqzqj30ka0et77a.jpg); 前言 起...
摘要:前言最近參加了幾場面試,積累了一些高頻面試題,我把面試題分為兩類,一種是基礎(chǔ)試題主要考察前端技基礎(chǔ)是否扎實,是否能夠?qū)⑶岸酥R體系串聯(lián)。 前言 最近參加了幾場面試,積累了一些高頻面試題,我把面試題分為兩類,一種是基礎(chǔ)試題: 主要考察前端技基礎(chǔ)是否扎實,是否能夠?qū)⑶岸酥R體系串聯(lián)。一種是開放式問題: 考察業(yè)務(wù)積累,是否有自己的思考,思考問題的方式,這類問題沒有標準答案。 基礎(chǔ)題 題目的答...
摘要:本系列的第一篇文章著重提供一個關(guān)于引擎運行時和調(diào)用棧的概述。在硬件層面,計算機內(nèi)存由大量的觸發(fā)器組成。每個觸發(fā)器包含幾個晶體管能夠存儲一個比特譯注位??梢酝ㄟ^唯一標識符來訪問單個觸發(fā)器,所以可以對它們進行讀寫操作。比特稱為個字節(jié)。 原文 How JavaScript works: memory management + how to handle 4 common memory lea...
摘要:什么是內(nèi)存泄漏簡介,內(nèi)存,硬盤的關(guān)系工作的時候需要從存儲器里取數(shù)據(jù)出來。引發(fā)內(nèi)存泄漏的方式意外的全局變量對未聲明變量的處理方式在全局對象上創(chuàng)建該變量的引用即全局對象上的屬性,不是變量,因為它能通過刪除。這樣會造成意外的內(nèi)存泄漏。 什么是內(nèi)存泄漏 簡介 CPU,內(nèi)存,硬盤的關(guān)系 CPU(Central Processing Unit)工作的時候: 1、需要從存儲器里取數(shù)據(jù)出來?! ?、...
閱讀 3567·2021-11-25 09:43
閱讀 3145·2021-10-08 10:04
閱讀 1635·2019-08-26 12:20
閱讀 2067·2019-08-26 12:09
閱讀 609·2019-08-23 18:25
閱讀 3581·2019-08-23 17:54
閱讀 2337·2019-08-23 17:50
閱讀 814·2019-08-23 14:33