簡體   English   中英

關鍵字“new”在JavaScript中有什么副作用?

[英]What side effects does the keyword 'new' have in JavaScript?

我正在研究jQuery的插件,我收到了這個JSLint錯誤:

Problem at line 80 character 45: Do not use 'new' for side effects.

(new jQuery.fasterTrim(this, options));

我沒有太多運氣找到有關此JSLint錯誤的信息或new可能產生的任何副作用。

我試過谷歌搜索 “不要使用'新'副作用。” 得到0結果。 Binging給了我2個結果,但它們都只引用了JSLint源代碼。 希望這個問題會改變這一點。 :-)

更新#1:以下是上下文的更多來源:

  jQuery.fn.fasterTrim = function(options) {
    return this.each(function() {
      (new jQuery.fasterTrim(this, options));
    });
  };

更新#2:我使用Starter jQuery插件生成器作為我的插件的模板,其中包含該代碼。

JsLint本身就是你的理由:

構造函數是旨在與新前綴一起使用的函數。 新前綴基於函數的原型創建一個新對象,並將該對象綁定到函數的隱含此參數。 如果忽略使用新前綴,則不會創建新對象,並且這將綁定到全局對象。 這是一個嚴重的錯誤。

JSLint強制執行構造函數為初始大寫的名稱的約定。 除非具有新的前綴,否則JSLint不希望看到具有初始大寫名稱的函數調用。 JSLint不期望看到與名稱不以初始大寫開頭的函數一起使用的新前綴。 這可以使用newcap選項進行控制。

JSLint不希望看到包裝器形成新的Number,new String,new Boolean。

JSLint不期望看到新的Object(而是使用{})。

JSLint不希望看到新的數組(改為使用[])。

特拉維斯,我是Starter網站的開發者。

@Pointy擊中了頭部。 以這種方式編寫Starter代碼的原因是因為我們確實需要一個新對象,所以我們不需要在那時存儲對它的引用。

只需更改命令即可

(new jQuery.fasterTrim(this, options)); 

var fT = new jQuery.fasterTrim(this, options);

你會發現安撫JSLint。

Starter插件設置遵循jQuery UI模式,即在元素的data集中存儲對象的引用。 所以這就是發生的事情:

  1. 創建新對象(通過新)
  2. 該實例使用jQuery的data附加到DOM元素: $(el).data('FasterTrim', this)

返回的對象沒有用處,因此沒有進行var聲明。 我將研究更改聲明和清理輸出以開箱即用的JSLint。

更多背景

使用data存儲對象的好處是我們可以隨時通過調用: $("#your_selector").data('FasterTrim')來訪問對象。 但是,如果你的插件不需要在流中途訪問(意思是,它在一次調用中設置並且不提供將來的交互),則不需要存儲引用。

如果您需要更多信息,請告訴我。

這是抱怨,因為你打電話給“新”但隨后扔掉了退回的物品,我敢打賭。 為什么該代碼使用“新”? 換句話說,為什么不是這樣

jQuery.fasterTrim(this, options);

編輯確定,“Starter”工具生成代碼,因為它確實需要創建一個新對象,是的,它確實是利用副作用。 “Starter”生成的構造函數代碼使用jQuery“data”工具存儲對受影響元素上的新對象的引用。

您正在使用new來執行某些操作,而不是創建對象並將其返回。 JSLint認為這是對new的無效使用。

你應該像這樣使用它:

var x = new SomeConstructor();

或者像這樣執行一些操作:

SomeMethod();

但是永遠不要用new來執行這樣的動作:

new SomeCosntructor(args);

這樣做被認為是使用new作為副作用,因為您沒有使用它來創建對象。

基本上JavaScript往往是一個緩慢的野獸,因此創建一個新對象只是為了調用一個函數是非常低效的。 無論如何,該功能是靜態的。

$.fasterTrim(this, options);

來自jQuery fasterTrim源代碼

 * Usage: 
 * 
 * $(element).fasterTrim(options);  // returns jQuery object
 * $.fasterTrim.trim(" string ", options);  // returns trimmed string

要回答這個問題,“不要使用新的副作用”意味着:

不要使用new作為構造函數將對其參數執行的操作,而是創建一個對象,構造函數中的副作用是baaaad!

暫無
暫無

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

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