Javascript 为什么';onhashchange';在(窗口)工作?

Javascript 为什么';onhashchange';在(窗口)工作?,javascript,Javascript,使用in()工作并不奇怪,因为new(XMLHTTPRequest)或typeof(x)是此构造的其他示例,但不必将字符串与分隔在一起 这是否符合ECMAScript规范?它在Chrome和FF中工作,还没有测试IE。从我可以看出,在这个特定实例中,是否将窗口括在括号中没有区别。无论哪种方式,它都会在窗口对象上检查此成员 如果使用空格,可能会更容易混淆: 'onhashchange'in(window) 同 'onhashchange' in (window) 中的不是一个函数,但是当您删除

使用
in()
工作并不奇怪,因为
new(XMLHTTPRequest)
typeof(x)
是此构造的其他示例,但不必将字符串与
分隔在一起


这是否符合ECMAScript规范?它在Chrome和FF中工作,还没有测试IE。

从我可以看出,在这个特定实例中,是否将
窗口
括在括号中没有区别。无论哪种方式,它都会在
窗口
对象上检查此成员

如果使用空格,可能会更容易混淆:

'onhashchange'in(window)

'onhashchange' in (window)
中的
不是一个函数,但是当您删除空格时,我可以看到您是如何读取它的。将
窗口
包装在括号中的一个优点是,您可以缩小代码:

'onhashchange' in window

如果没有括号,你就无法做到这一点。

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

'onhashchange'in(window)
更令人困惑的是,您可以在
for()
循环中使用
in
,就好像它(
in
)是迭代器一样。我对
循环的
思考方式如下:

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

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

换言之,循环将继续,直到
中的
条件失败,这将在成员用完时发生。

是字符串结尾的标记,因此一对
'
在语义上是明确的,您不需要在字符串结束后使用空格,lexer就可以知道它已经到达了字符串的结尾

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

此外,
中的
是一个关键字,而不是函数。您似乎认为
()
是“函数调用操作符”,但在本例中,它只是一个消除歧义的括号

这就像是问“为什么
1+(2)
起作用?”
+
不会仅仅因为你用一个paren跟随它而成为一个函数,类似地,以下内容也会起作用:

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

for (condition) {
    /* statements */
}

Javascript的空白规则很脆弱。

我无法理解你的问题,我可以再澄清一下吗。这与
typeof“foo”是一样的。
V.s.
typeof(“foo”)
类型的
中的
是运算符,不需要parenthesis@gdoron我认为paren存在的原因与应该使用分号的原因相同——以防代码被缩小或压缩。
typeof运算符以以下任一方式使用:typeof operand typeof(operand)
无论如何,它就像return
(“foo”)
而不是
返回“foo”
if((x)| |(y))
它们是多余的,只会使事情变得更复杂。“恐怕这与小型化的事情无关。”格多龙我想你误解了我。除非包含用于区分
in
运算符和
窗口
对象的参数,否则不能删除空格。如果没有paren,删除空白将导致窗口中的“onhashchange”,浏览器将无法理解该语句。它将引发一条
意外标识符
消息。如果将
窗口
换行,则情况并非如此。@JonathanSampson:删除一个空格字符的尝试导致了两个额外字符<代码>n中的x
n中的x
function foo(){}

foo

();