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