1
'onhashchange'in(window)

工作in()并不奇怪,就像这种构造new(XMLHTTPRequest)typeof(x)其他例子一样,但不必将字符串和inis 分开。

这符合 ECMAScript 规范吗?它适用于 Chrome 和 FF,尚未测试 IE。

4

3 回答 3

1

'是一个结束字符串的标记,所以一对''在语义上是明确的,你不需要在字符串结尾之后的空格让词法分析器知道它已经到达字符串的结尾。

另一种说法是,它的工作原理与它的'Hello '+'world'工作原理相同。

此外,in是关键字,而不是函数。似乎您将其()视为“函数调用运算符”,但在这种情况下,它只是一个消除歧义的括号。

这就像在问“为什么1 +(2)有效?” +不会仅仅因为您使用括号跟随它而成为一个函数,并且类似地以下将起作用:

function foo(){}

foo

();

Javascript 的空白规则很脆弱。

于 2012-05-04T03:09:40.900 回答
1

据我所知,window在这种特定情况下,是否用括号括起来没有区别。window无论哪种方式,它都会在对象上检查此成员。

如果您使用空格,可能不会那么混乱:

'onhashchange' in (window)

一样

'onhashchange' in window

in不是函数,但是当您删除空格时,我可以看到您是如何阅读它的。用括号括起来的一个好处window是您可以缩小代码:

'onhashchange'in(window)

没有括号你不能做的事情。

于 2012-05-04T02:55:33.800 回答
0

我不确定这个符号是否让你感到困惑(这可能in()是一种方法?),但in它是很少有人正确理解的 JS 元素之一(直到最近我才真正理解它)。这是一个简化版本,显示了以下内容in

var foo = {
    'bar':1,
    'barbar':2
}

console.log('bar' in foo); //true
console.log('baz' in foo); //false

更令人困惑的是,您可以infor()循环中使用,就好像它 ( in) 是一个迭代器。我倾向于认为for循环的方式是这样的:

for (exp1; condition; exp2) {
    /* statements */
}

for (condition) {
    /* statements */
}

换句话说,循环将继续,直到in条件失败,当它用完成员时会发生这种情况。

于 2012-05-04T03:07:36.443 回答