[英]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
集中存儲對象的引用。 所以這就是發生的事情:
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);
* Usage:
*
* $(element).fasterTrim(options); // returns jQuery object
* $.fasterTrim.trim(" string ", options); // returns trimmed string
要回答這個問題,“不要使用新的副作用”意味着:
不要使用new作為構造函數將對其參數執行的操作,而是創建一個對象,構造函數中的副作用是baaaad!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.