• 浏览器console输出undiefined



    重要修改记录

     新增:你不知道的js中》的第五章讲到了关于语句的结果值,具体规范在ES5的12.2中。并且提到了如果想要知道语句的结果值,可以在浏览器开发控制台输入语句,控制台就会显示最后一条语句的结果值。这是我找到的第一个关于浏览器控制台输出语句的说明。


    浏览器控制台运行js代码,会额外输出一个undifined。这个undefined到底是什么呢?

    比如下面的例子:

    >>> var a = 3;
    undefined
    
    >>> var a = 3; a = 4;
    4
    
    >>> var a = 3; a = 4; var a = 5; function f() {};
    4 // !!!

    浏览器控制台中运行js之后,输出的是语句的结果值。默认情况下控制台会显示执行的最后一条语句的结果值。一般情况下,我们是无法获得语句的结果值的,除了在浏览器中可以直接观察之外,使用eval()也可以获得语句的结果值(不建议在js程序中使用eval)。

    eval

    理解语句的结果值,可以从eval开始,有关于eval函数的描述

    eval可以接受一个字符串参数,该参数可以是js表达式、语句或者一系列语句。

    eval的返回值:执行指定代码之后的返回值。如果返回值为空,则返回undefined。

    Let result be the result of evaluating the program prog.

    If result.type is normal and its completion value is a value V, then return the value V.

    If result.type is normal and its completion value is empty, then return the value undefine

    Statement——completion value

    The result of evaluating a Statement is always a Completion value.

    每一个语句都有一个结果值。结果值可以是任何js值或者empty。如果有返回值,控制台输出返回值。如果没有返回值,那么将输出undefined。

    要知道结果值,从statement概念开始。statement(语句)中有expression statement(表达式语句)和declaration statement(声明语句)。其中expression statement指的是产生副作用的表达式,比如赋值表达式和函数调用表达式,这些表达式可以作为单独的语句,这种把表达式当做语句的用法叫做表达式语句。

    表达式语句的结果值:

    在这里说明一个表达式和语句的区别:表达式是一个短语,js解释器会将其计算(evaluate)出一个结果。

    语句就是js整句或者命令。表达式计算出一个值,但语句用来执行以使某件事发生。

    x = 4;//赋值语句

    表达式语句的值就是表达式的值。作为赋值表达式,因为赋值表达式的值就是右操作数的值,所以会输出4。(参考——运算符优先级

    变量声明语句的结果值:

    从图中可以看出,变量声明(VariableDeclaration)有一个返回值,是声明变量名称的字符串,但是这个值被变量语句(VariableStatement)算法屏蔽了(for in循环除外),最后结果返回空(undefined)。

    函数声明语句的结果值:

    所以变量声明和函数声明语句,返回值都是empty,则会输出undefined。

    参考:

    1. Stack Overflow上关于程序运行结果的某个回答
    2. stack Overflow上关于浏览器控制台运行原理的回答
    3. 可参考的ECMAScript规范部分
    4. stack Overflow本人认为最靠谱的解答
  • 相关阅读:
    从aptitude 换回 apt-get .
    ubuntu 通过安装TOMCAT7
    第一次ubuntu使用的故障排除 ...the public key is not available: NO_PUBKEY...
    DES加密算法应用:分组加密模式
    使用“牛顿迭代法”求解方程
    html当中如何引用js文件
    javascript当中火狐的firebug如何单步调试程序?
    给出一个javascript的Helloworld例子
    java中讲讲PrintWriter的用法,举例?
    卷积和神经网络有什么关系?
  • 原文地址:https://www.cnblogs.com/Jamie1032797633/p/11087514.html
Copyright © 2020-2023  润新知