下面是javascript中给出两个警报的代码?
下面的代码给了我两个警报,一个接一个-Hello1234和undefined下面是javascript中给出两个警报的代码?,javascript,Javascript,下面的代码给了我两个警报,一个接一个-Hello1234和undefined var b ={ status:"Ready" , deep : { a:12 , b:"String" , c:function() {alert("Hello1234"); } } } alert(b.deep.c()); 有人能告诉我为什么会
var b ={ status:"Ready" ,
deep : { a:12 , b:"String" ,
c:function() {alert("Hello1234");
}
}
}
alert(b.deep.c());
有人能告诉我为什么会发生这种情况吗?因为你调用了两次
alert()
:一次在c()
内部,然后在c()
的结果中再次调用cc
不返回任何可报警的内容,因此你得到未定义的,返回一些内容:
var b ={ status:"Ready" ,
deep : { a:12,
b:"String" ,
c:function() {
alert("Hello1234");
return "ALERT ME";
}
}
}
alert(b.deep.c());
似乎您希望“Hello…”作为值
请尝试以下操作:
var b ={ status:"Ready" ,
deep : { a:12 , b:"String" ,
c:function() {return "Hello1234";
}
}
}
alert(b.deep.c());
函数c
不返回任何值,因此当您调用alert(c())
时,它会执行c
(它会向“Hello1234”发出警报),然后向返回值发出警报-未定义的发生这种情况是因为:
b.deep.c()李>
该方法的返回值未定义,但您尝试警告
返回值,因此获取[undefined]的字符串表示形式undefined
印刷精美,即:
var b = {
status: "Ready",
deep: {
a: 12,
b: "String",
c: function () {
alert("Hello1234");
}
}
};
alert(b.deep.c());
首先,您使用对对象
实例的引用初始化变量b
。该对象使用自己的状态
和深度
属性初始化。deep
属性通过引用另一个对象
实例进行初始化。另一个对象用属性a
、b
和c
初始化。属性c
通过引用匿名函数
实例(一个没有名称的实例)进行初始化<代码>函数
实例是可调用的对象
在第二步中,调用alert()
方法(应该是window.alert(…)
)。您正在向该方法传递c
属性所引用的函数的返回值
这就调用了这个函数
function () {
alert("Hello1234");
}
(在伪代码中)它本身有一个
alert("Hello1234");
打电话进来。因此将调用alert()
,并首先显示“Hello1234”
然后,发出alert()
调用的函数结束,因为没有更多语句。函数没有显式返回值(使用return
语句),因此它隐式返回undefined
类型的undefined
值
我们现在回到最初的alert()
调用。b.deep.c()
的返回值是未定义的值,因此
alert(b.deep.c());
被评估为
alert(undefined);
alert("undefined");
但是设计用于显示文本消息的alert()
,需要一个字符串
值。因此,它执行从Undefined
到String
的类型转换
ECMAScript实现中的每个值都有一个字符串表示形式。undefined
值的字符串表示形式是“undefined”
,因此
alert(String(undefined));
被评估为
alert(undefined);
alert("undefined");
这就是为什么第二个警报框显示“未定义”。如果您使用脚本调试器(例如内置的或适用于基于Mozilla的浏览器(如Firefox)的脚本调试器)逐步调试程序,您可以自己看到这一点。您希望发生什么?@AlexK。不,因为它没有显式返回任何内容,所以它隐式返回undefined
值,该值的字符串表示形式是“undefined”
。b.deep.c()
的返回值是undefined
值,它具有字符串表示形式“undefined”
@PointedEars,这就是“该方法的返回值未定义”undefined
不等同于“notdefined”。undefined
是这些语言中的一个值,是undefined
类型的唯一值。当该值通过window.alert()
转换为字符串时,结果是原始字符串值”未定义“
@PointedEars-任何已声明但未初始化的变量都将初始化为未定义的
。任何到达控制末尾而没有返回语句的函数都返回未定义的。因此,在这种情况下,“未定义”实际上相当于“未定义”
。谢谢@FrankieTheKneeMan,本不可能更好地解释它。为什么这是正确的,却被否决了?@Zar,因为它不正确。发出“未定义”警报的原因是返回了“可警报”的内容。事实上,由于每个值都有一个字符串表示,所以所有内容通常都是“可警报的”。有关详细信息,请参阅我的答案。