簡體   English   中英

在JavaScript中為多個變量分配相同的函數時的性能問題

[英]Performance issue when assigning the same function to multiple variables in JavaScript

[編輯]重要! 函數被視為對象,而不是值。 所以這個問題是無效的,因為它是基於錯誤的假設。 此編輯用作注釋,以避免混淆閱讀此問題的任何人。

假設我有一個函數表達式foo

var foo = function() {
    return this.member;
}

我有以下類,並用“foo”作為回調函數實例化它的許多對象。

var simpleClass = function(callback) {
    this.member = "I am an instance variable";
    this.callback = callback;
}
var a = new simpleClass(foo);
var b = new simpleClass(foo);
var c = new simpleClass(foo);
.
.
.

因為在JavaScript中,參數是通過值傳遞的,所以我們將foo的 ([編輯]實際上它應該是對象)復制到a,b,c和其他變量的回調中。 如果我的理解是正確的,那么foo將被復制n次,每次占用每個對象的特定存儲空間。

基於這種理解,我對這種情況有一些性能問題:

  1. 將函數復制到多個變量是否會損害性能?

由於“foo”的每個副本作為simpleClass對象的“回調”占用空間,如果真的有很多simpleClass對象(例如在DOM庫中我有數千個具有相同函數css()的DOM對象),它是否會損害性能顯著? 或者大多數JavaScript引擎都有解決這種情況的機制,它通常不會造成任何傷害?

  1. 在可能創建數百或數千個對象的情況下。 將這些共享函數放到對象的原型中總是一個好習慣嗎?

由於所有對象實例共享相同的類原型,如果我們將“foo”函數放到simpleClass的原型中,那么應該只有一個“foo”的副本,並且每個對象實例將只執行“foo”的原型副本“ 需要的時候。 這是一個我們應該遵循的好習慣嗎?

我嘗試搜索類似的關鍵字,但找不到正確的措辭來找到這個問題的解決方案。 如果我做不清楚的話,請更正我的措辭。 當然,如果我有任何誤解,請糾正我。 我感謝大家的幫助。

我不太了解這一點,給你一個權威的答案,但我可以這樣說:

然后foo將被復制n次,每次占用每個對象的特定內存空間。

這是不正確的。 foo是一個指向函數的變量。 foo不是函數,如果你做了var bar = foobar現在也指向函數,功能相同 因此不復制該功能。 該函數的引用被賦予this.callback

  1. 在可能創建數百或數千個對象的情況下。 將這些共享函數放到對象的原型中總是一個好習慣嗎?

在JavaScript中有什么和不是很好的做法是有爭議的。 有些人喜歡使用類/原型,其他人喜歡使用對象文字。 雖然該prototype可以幫助減少應用程序的內存占用,但這絕對是正確的。 看起來像這樣:如果您正在使用prototype那么您將為JavaScript引擎提供有關該對象的更多信息,即。 您的對象與所有這些其他對象類似。 JavaScript引擎應該能夠基於此進行優化。 我不能對確切的數字說太多,每個供應商可能會有很大差異。


您的代碼示例等效於:

function foo() {}
function myClass() {
    this.foo = foo;
}
var instance = new myClass();

如果你使用原型你會寫:

function myClass() {}
myClass.prototype.foo = function () {};
var instance = new myClass();

如果您使用了對象文字,您將擁有:

function foo() {};
function create_myClass() {
    return {
        foo: foo
    };
}
var instance = create_myClass();

在上面的所有情況下,函數foo永遠不會被復制 在這種情況下,下面你要做創建的新副本foo每一次:

function myClass() {
    this.foo = function () {}; // new copy every time
}
var instance = new myClass();

function create_myClass() {
    return {
        foo: function () {}; // new copy every time
    };
}

至於表現。 這是我經常給出的提示:在遇到可測量的問題之前不要開始優化。 始終使用真實數據進行測量 此外,如果您認為您的工作方式很好,那么JavaScript引擎供應商可能會針對該方法進行優化。

在javascript中,引用不是復制對象本身,因此您無法將值賦給回調以從構造函數內部更改函數。 你的代碼所有那些對象將共享函數,看看這個snipet:

 var foo = function() { return this.member; } var simpleClass = function(callback) { this.member = "I am an instance variable"; this.callback = callback; } var a = new simpleClass(foo); var b = new simpleClass(foo); alert(a.callback === b.callback ? 'shared' : 'not shared'); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM