-4

下面的代码一个接一个地给我两个警报 - Hello1234 和 undefined

var b ={ status:"Ready" ,
         deep : { a:12 , b:"String" ,
                  c:function() {alert("Hello1234");
                               }
                 }  
        }

alert(b.deep.c());

谁能让我知道为什么会这样?

4

6 回答 6

4

因为您调用alert()了两次:一次在 of 内部,c()然后再次以 . 的结果调用c()

于 2012-09-25T14:57:51.690 回答
1

看来您想要“Hello..”作为值尝试以下操作:

var b ={ status:"Ready" ,
         deep : { a:12 , b:"String" ,
                  c:function() {return "Hello1234";
                               }
                 }  
        }

alert(b.deep.c());
于 2012-09-25T14:58:58.953 回答
1

发生这种情况是因为:

  1. b.deep.c()里面有一个电话alert
  2. 该方法的返回值未定义,但您尝试alert返回值,因此获取 [未定义的字符串表示形式] undefined
于 2012-09-25T14:59:09.507 回答
0

c返回什么都没有,所以你得到undefined,返回一些东西:

var b ={ status:"Ready" ,
         deep : { a:12,
                  b:"String" ,
                  c:function() {
                     alert("Hello1234"); 
                     return "ALERT ME";
                  }
                 }  
        }

alert(b.deep.c());​
于 2012-09-25T14:58:55.990 回答
0

该函数c不返回任何值,因此当您调用alert(c())它时会执行c(警告“Hello1234”)然后警告返回值 - undefined

于 2012-09-25T14:59:05.910 回答
0

印刷精美,即:

var b = {
  status: "Ready",
  deep: {
    a: 12,
    b: "String",
    c: function () {
      alert("Hello1234");
    }
  }  
};

alert(b.deep.c());

首先,您正在使用对实例b的引用来初始化变量。Object该对象使用自己的statusdeep属性进行初始化。该deep属性使用对另一个Object实例的引用进行初始化。另一个对象使用属性ab和进行初始化c。属性c通过对匿名Function实例(没有名称的实例)的引用进行初始化。 Function实例是可调用的对象。

在第二步中,您正在调用该alert()方法(应该window.alert(…)改为)。您正在向该方法传递该属性所引用的函数的返回值。c

这调用了该函数,

function () {
  alert("Hello1234");
}

(在伪代码中)它本身有一个

  alert("Hello1234"); 

打电话给它。如此alert()调用,首先显示“Hello1234”。

然后进行该alert()调用的函数结束,因为没有更多的语句。该函数没有显式返回值(使用return语句),因此它隐式返回该类型的undefinedUndefined

我们现在又回到了最初的alert()通话中。的返回值b.deep.c()就是undefined值,所以

alert(b.deep.c());

被评估为

alert(undefined);

但是alert(),旨在显示文本消息,需要一个String值。因此,它执行从到的类型转换UndefinedString

ECMAScript 实现中的每个值都有一个字符串表示。该undefined值的字符串表示形式是"undefined",所以

alert(String(undefined));

被评估为

alert("undefined");

这就是第二个警报框显示“未定义”的原因。如果您使用脚本调试器(例如内置的Chrome/Chromium 调试器或用于 Firefox 等基于 Mozilla 的浏览器的Firebug 扩展程序)逐步执行程序,您可以自己看到这一点。

于 2012-09-25T15:14:56.143 回答