2015-12-08 19 views
1

直到今天,我還不知道with運算符是否存在。我在調試插件引發的問題(Backbone.Epoxy)時偶然發現了它。使用運算符和對象鍵中的破折號

運算符爲傳遞的對象上的每個屬性創建塊級作用域。

var testObj = { "cat":true }; 
with (testObj) { 
    console.log(cat ? "Cat!": "dog"); // Cat! 
} 

夠簡單嗎?起初,我認爲這可能會非常酷。直到我意識到爲什麼我的代碼拋出一個錯誤。這是從我的代碼派生的例子。

var testObj = { "css":true, "background-color":"blue" }; 
with (testObj) { 
    console.log(css ? background-color : ""); // throws 
} 

實際的代碼更加動態一些,但這實際上是在插件的幕後發生的。由於破折號不允許在變量名稱中,但在屬性名稱中允許,導致錯誤被引發。

所以,問題:

  1. 有沒有一種方法來淨化塊範圍局部變量,以避免問題與破折號,同時保持它在我的財產的名字嗎?
  2. 有沒有其他人使用環氧樹脂解決了這個問題?
+5

你最好[避免'與'altogther](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/with)。更多[這裏的信息](http://stackoverflow.com/questions/61552/are-there-legitimate-uses-for-javascripts-with-statement)。 – Andy

+2

這與'window'屬性相同。你可以定義'window ['a-b'] = 4;'但不能寫'console.log(a-b);'。在某些情況下,你可以寫'this ['background-color']'。 – Xufox

+0

@Xufox噢!我沒有想到這個問題,很好的捕捉。 –

回答

3

你將不得不破例寫:

testObj["background-color"] 

正如你可能會懷疑,你可以不寫只是background-color,你可以不寫testObj.background-color一樣的道理。你還應該問一下,使用with是否相當不合規,是否值得角色數量節省。通常答案是「否」。

+0

我們實現的難點在於with運算符在插件中被深度使用。通常,我們儘量避免更改插件源代碼。如果這是我們的開發人員寫的,那麼寫起來會更容易。我目前已經向插件團隊提出了問題:https://github.com/gmac/backbone.epoxy/issues/130 –

+0

@ Mad-Chemist問題不在於它是作爲塊級本地變量,這是你從'background'減去'color'。它實際上存在於你新定義的塊範圍中,但是你不能以正常的方式訪問它 - 你必須做我在我的回答中建議的內容。 –

+0

@ Mad-Chemist,您使用的那個插件是用來處理您傳入的數據的? – CBroe