2011-07-23 106 views
7

我想知道如何管理JavaScript的保留關鍵字/功能。javaScript保留關鍵字

實施例:

據:

http://www.quackit.com/javascript/javascript_reserved_words.cfm

delete是由JavaScript保留關鍵字。

然後考慮下面的代碼片段的一些背景:

var cookieManager = { 
    get: function (name) { 
     // function contents ... 
     console.log("cookieManager.get() called"); 
     return true; 
    }, 
    set: function (name, value, days) { 
     // function contents ... 
     console.log("cookieManager.set() called"); 
     return true; 
    }, 
    delete: function (name) { 
     // function contents ... 
     console.log("cookieManager.delete() called"); 
     return true; 
    } 
}; 

這個對象有一個delete性質,但它的名字是由JavaScript保留所以它失敗了,對不對?

然而,當我在FireFoxwebconsole執行cookieManager.delete();我得到下面的輸出,這表明它工作正常:

[11:26:00.654] cookieManager.delete(); 
[11:26:00.656] cookieManager.delete() called 
[11:26:00.657] true 

但是,如果你在JsLint運行的代碼,它說

Problem at line 12 character 5: Expected an identifier and instead saw 'delete' (a reserved word). 

delete: function (name) { 

暗示這是一個很大的沒有沒有的方法,應該避免。

因此,何時應該考慮保留關鍵字,就像在這個例子中,它看起來像我想要的那樣工作(delete關鍵字在對象cookieManager的上下文中,因此不會造成衝突,因此它可以是使用)還是我應該遵守JsLint的聖經,並重新命名爲javascript的保留關鍵字?在這種情況下,我可以輕鬆地將.delete()重命名爲.remove()。

回答

8

其實這是允許按ECMAScript specification。生產規則(Section 11.1.5)爲對象的文字是:

ObjectLiteral : 
    {} 
    {PropertyNameAndValueList} 
    {PropertyNameAndValueList ,} 

PropertyNameAndValueList : 
    PropertyAssignment 
    PropertyNameAndValueList , PropertyAssignment 

PropertyAssignment : 
    PropertyName : AssignmentExpression 
    get PropertyName (){FunctionBody} 
    set PropertyName (PropertySetParameterList){FunctionBody} 

PropertyName : 
    IdentifierName 
    StringLiteral 
    NumericLiteral 

在您的情況,您使用的IdentifierName作爲屬性名稱。 Section 7.6.1說:

的保留字是不能被用作一個IdentifierIdentifierName

注意區別:不能使用保留關鍵字作爲標識符,但因爲它是一個有效的IdentifierName你可以使用它作爲屬性名


儘管如此,其他(版本)的瀏覽器可能不會容忍這個,所以爲了安全起見,我會重命名它。

除了瀏覽器可能存在的問題外,還可能會讓讀者不熟悉這條規則的人感到困惑。


FWIW,當然你也可以隨時使用保留的關鍵字作爲字符串:

var a = {'delete': 'foo'}; 
alert(a['delete']); 
+0

因此,要澄清,因爲'PropertyName'生產規則使用'IdentifierName'而不是'Identifier',這是罰款使用'刪除'等作爲'PropertyName'? –

+0

@德蘭:我會說是的。但這並不意味着瀏覽器遵循相同的規則。 –

+0

另外,如果你運行''嚴格模式下的代碼''它應該會拋出一個錯誤 – Raynos