什么是';在';javascript中的关键字是什么意思?

什么是';在';javascript中的关键字是什么意思?,javascript,Javascript,我发现这个代码: if (!("aa" in window)) { alert('oh my god'); var aa = 1; } alert("aa" in window); alert(aa); 此代码表示第二个警报为警报true,但第三个警报为“未定义”,且“如果”中的警报未运行。为什么? 我认为原因是中的;它的作用是什么 我在谷歌上搜索了一下,但什么也没找到,因为谷歌认为“in”这个词;是一个过滤词 我们总是在循环中使用in,但坦率地说,我使用它,但并不

我发现这个代码:

if (!("aa" in window)) {  
    alert('oh my god');
    var aa = 1;  
}  
alert("aa" in window);
alert(aa);
此代码表示第二个警报为警报
true
,但第三个警报为“未定义”,且“如果”中的警报未运行。为什么?

我认为原因是中的
;它的作用是什么

我在谷歌上搜索了一下,但什么也没找到,因为谷歌认为“in”这个词;是一个过滤词


我们总是在循环中使用
in
,但坦率地说,我使用它,但并不真正理解它。

这测试
窗口
对象是否具有键为
“aa”
的属性(填充或未填充)

此运算符非常有用,因为即使值是
未定义的
,它也可以工作:

window.aa = undefined; // or just aa=undefined if you're in the global scope
console.log('aa' in window); // logs true
如果属性不可枚举,它也可以工作:

console.log('length' in []); // logs true
在您的情况下,可能没有
aa
值,但如果警报显示为true,则该属性已添加到
窗口

请注意,
for…in
语句的不同之处在于它实际上没有使用
in
运算符,而是一个特定的构造


编辑:对已编辑问题的解释(与第一个问题非常不同):

您的困惑似乎源于您声明了
var aa=1在块中。您应该知道,JavaScript中变量的作用域要么是全局作用域的函数,要么是挂起的声明。所以你的代码实际上相当于

var aa = undefined;
if (!("aa" in window)) { // aa is in window, so we don't enter here
    alert('oh my god');
    aa = 1;  
}  
alert("aa" in window); // yes, the property exists, it's true
alert(aa); // aa is still undefined

按顺序接收警报:

  • 警报#1永远不会到达,因为
    (“窗口中的aa)==true
    所以
    if
    布尔条件为false
JavaScript有一个变量,变量
aa
首先到达作用域的顶部,因此定义了它

  • 警报#2
窗口中的“aa”为真,因为该变量是在窗口对象被提升时添加到该窗口对象的。相当于只写:

var foo;
"foo" in window (which === true)
  • 警报#3
从:

variable语句声明按照10.5中的定义创建的变量。变量在创建时初始化为未定义。带有初始值设定项的变量在执行VariableStatement时,而不是在创建变量时,分配其AssignmentExpression的值


因此,
aa
未定义,因为从未执行分配。

中的
检查
对象中是否存在属性

//在下面的代码段中,他们正在检查“window”对象中是否存在“aa”属性。因为变量是函数,所以函数声明被提升。如果有人拦住你,你永远也进不去。
var aa=未定义;
如果(!(“窗口中的aa”){//2=>“aa”属性存在
警惕(“哦,我的上帝”);
aa=1;//1=>已吊装
}  

我猜名为
aa
的变量是在全局上下文中创建的<代码>警报(窗口中的“aa”)为我返回false,但
aa=“foo”;警报(窗口中的“aa”)返回true。哦,天哪,我想我在回答这个问题时丢失了一些代码……如果你问的是警报,我想这是一个完全不同的问题。我建议编辑问题标题,以便更好地描述您的问题。@LIXer我编辑我的答案是为了回答新问题,但下次请尝试立即修复您的问题,或者在您意识到您第一次给出的代码不适合您时问新问题。谢谢,我知道函数的作用域,但是我认为我的代码中没有任何功能,哦,不,我的JavaScript是如此之弱,非常乐意帮助!这是一个有趣的问题。由于JavaScript中没有块作用域(块作用域定义为
{…}
),因此变量将在
if
块之外可用。欢迎使用。但是你应该删除问题的编辑部分:问题不应该包括答案,所以。让我们为将来的其他用户澄清一下。