为什么'onhashchange'in(窗口)有效?

时间:2012-05-04 02:52:52

标签: javascript

'onhashchange'in(window)

in()工作并不令人意外,因为new(XMLHTTPRequest)typeof(x)是此构造的其他示例,但不必将字符串与in分开。< / p>

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

3 个答案:

答案 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条件失败,这将在成员用完时发生。