Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下面是javascript中给出两个警报的代码?_Javascript - Fatal编程技术网

下面是javascript中给出两个警报的代码?

下面是javascript中给出两个警报的代码?,javascript,Javascript,下面的代码给了我两个警报,一个接一个-Hello1234和undefined var b ={ status:"Ready" , deep : { a:12 , b:"String" , c:function() {alert("Hello1234"); } } } alert(b.deep.c()); 有人能告诉我为什么会

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

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

alert(b.deep.c());

有人能告诉我为什么会发生这种情况吗?

因为你调用了两次
alert()
:一次在
c()
内部,然后在
c()
的结果中再次调用
c

c
不返回任何可报警的内容,因此你得到
未定义的
,返回一些内容:

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,因为它不正确。发出“未定义”警报的原因是返回了“可警报”的内容。事实上,由于每个值都有一个字符串表示,所以所有内容通常都是“可警报的”。有关详细信息,请参阅我的答案。