'onhashchange'in(window)
让in()
工作并不令人意外,因为new(XMLHTTPRequest)
或typeof(x)
是此构造的其他示例,但不必将字符串与in
分开。< / p>
这符合ECMAScript规范吗?它适用于Chrome和FF,尚未测试IE。
答案 0 :(得分:1)
据我所知,在这个特定实例中是否将window
括在括号中是没有区别的。无论哪种方式,它都会在window
对象上检查此成员。
如果你使用空格,可能会减少混淆:
'onhashchange' in (window)
与
相同'onhashchange' in window
in
不是一个函数,但当你删除空格时,我可以看到你是如何读取它的。将window
括在括号中的一个好处是,您可以缩小代码:
'onhashchange'in(window)
没有括号你不能做的事。
答案 1 :(得分:1)
'
是一个结束字符串的标记,因此一对''
在语义上是明确的,你不需要在字符串结尾后的空格,以便词法分析器知道它已到达字符串的结尾。
另一种说法是,这与'Hello '+'world'
的工作原理相同。
此外,in
是关键字,而不是函数。看起来你在想()
作为“函数调用运算符”,但在这种情况下,它只是一个消除歧义的括号。
这就像问“为什么1 +(2)
有效?” +
只是因为你用paren跟随它而不能成为一个函数,同样以下方法也可以工作:
function foo(){}
foo
();
Javascript的空白规则很脆弱。
答案 2 :(得分:0)
我不确定符号是否让你感到困惑(也许in()
可能是一种方法?),但是in
是JS中很少有人能够正确理解的元素之一(我没有'直到最近才真正理解它。这是一个简化版本,显示了in
的作用:
var foo = {
'bar':1,
'barbar':2
}
console.log('bar' in foo); //true
console.log('baz' in foo); //false
使更令人困惑的是,您可以在in
循环中使用for()
,就像它(in
)是迭代器一样。我倾向于考虑for
循环的方式是这样的:
for (exp1; condition; exp2) {
/* statements */
}
for (condition) {
/* statements */
}
换句话说,循环将继续,直到in
条件失败,这将在成员用完时发生。