印刷精美,即:
var b = {
status: "Ready",
deep: {
a: 12,
b: "String",
c: function () {
alert("Hello1234");
}
}
};
alert(b.deep.c());
首先,您正在使用对实例b
的引用来初始化变量。Object
该对象使用自己的status
和deep
属性进行初始化。该deep
属性使用对另一个Object
实例的引用进行初始化。另一个对象使用属性a
、b
和进行初始化c
。属性c
通过对匿名Function
实例(没有名称的实例)的引用进行初始化。 Function
实例是可调用的对象。
在第二步中,您正在调用该alert()
方法(应该window.alert(…)
改为)。您正在向该方法传递该属性所引用的函数的返回值。c
这调用了该函数,
function () {
alert("Hello1234");
}
(在伪代码中)它本身有一个
alert("Hello1234");
打电话给它。如此alert()
调用,首先显示“Hello1234”。
然后进行该alert()
调用的函数结束,因为没有更多的语句。该函数没有显式返回值(使用return
语句),因此它隐式返回该类型的undefined
值Undefined
。
我们现在又回到了最初的alert()
通话中。的返回值b.deep.c()
就是undefined
值,所以
alert(b.deep.c());
被评估为
alert(undefined);
但是alert()
,旨在显示文本消息,需要一个String
值。因此,它执行从到的类型转换。Undefined
String
ECMAScript 实现中的每个值都有一个字符串表示。该undefined
值的字符串表示形式是"undefined"
,所以
alert(String(undefined));
被评估为
alert("undefined");
这就是第二个警报框显示“未定义”的原因。如果您使用脚本调试器(例如内置的Chrome/Chromium 调试器或用于 Firefox 等基于 Mozilla 的浏览器的Firebug 扩展程序)逐步执行程序,您可以自己看到这一点。