2015-12-08 17 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