为了账号安全,请及时绑定邮箱和手机立即绑定

javascript基础语法(表达式),见解。

javascript基础语法(表达式),见解。

繁星coding 2019-03-15 11:15:42
进入误区,请帮忙解答函数调用表达式function fn() {}fn() 这函数调用表达式会返回一个值所有是一个表达式。当函数fn中return后面没有值的时候,返回的就是undefined,有值则返回的就是return后面的值,是否可以这样理解?函数表达式var a = function() {};function() {} 单独应该是一个函数声明吧。当赋值变量a时,a = function() {} 就有一个表达式。如果这样的话,a = function() {}应该会返回一个值吧,如果是这样的话,请问值是多少?原是表达式var b = 1; 在这1是一个表达式,b=1也是一个表达式。不解的是 函数表达式以上为例。function() {} 就不是表达式?而a = function() {}这样就是表达式了呢?比较函数调用表达式。调用时会返回一个值。所以是表达式。函数表达式。还以上函数表达式为例。function() {}没有被调用,所以不会返回值,就是一个函数声明,不解的是赋值给a后,这 a = function(){} 后就是表达式了呢?是的话应该肯定返回一个值吧。那值是什么呢?
查看完整描述

5 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

本来这么基础的问题是不想回答的,但是看了前面几个回答,感觉不少人对表达式这个基础知识点可能还不是完全理解,所以就简单写一下吧。

什么是表达式?表达式是用运算符连接的一个或多个值、变量、函数及其他运算数所形成的式子。

  • fn()这是一个函数调用表达式,因为()是函数调用运算符(去查一下运算符有哪些就知道了)

  • a = function() {}这是一个复合表达式,它由afunction() {}两个子表达式和一个赋值运算符组成。但是注意var a = function() {};不是一个表达式,而是一个语句,因为它包含var和分号,它们都不是运算符

  • b = 1var b = 1;与上一条相同

不解的是 函数表达式以上为例。function() {} 就不是表达式?而a = function() {}这样就是表达式了呢?

首先,为什么单独写function a() {}不是表达式?

这是因为这句代码“声明”了一个名为a的函数。在解析的时候,JS引擎会对这种形式的函数声明做一些特殊处理,比如声明提升。

用一句不太严格的话来解释,函数声明类似于整条语句var a = function() {};,只是JS引擎在遇到这么一个声明的时候会自动对其进行提升。前面已经解释过这种形式的语句不是表达式。

那为什么a = function() {}是一个表达式呢?

在JS中,函数是一等公民,可以像其他值和变量那样赋值、传递,这个表达式右边正是这么一个函数类型的值。甚至你还可以这么写:a = function a() {},右边看起来与前面的函数声明更像了,但这仍然是一个表达式,因为在JS中,匿名函数也可以指定一个名字。

因此关于这一点,总结下来就是:JS引擎在解析时会依据函数的定义形式不同而做出不同的解析,其中仅会在函数定义不作为任何子表达式存在时才是函数声明,否则就会把该函数的定义当做函数表达式来解析。


查看完整回答
反对 回复 2019-03-20
?
阿晨1998

TA贡献2037条经验 获得超6个赞

你这儿就是典型的理解过度。给你一段代码,自己领悟吧


var a;  //声明一个变量 这里是一个声明

a = 13; //变量赋值

上面的代码等同于


var a = 13; //声明变量并赋值 这里是一个表达式

同理:


function a(){  //这里一个声明

}  

var a = function(){  //这里是一个表达式

    

}


查看完整回答
反对 回复 2019-03-20
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

简单地说,这是语言规范规定的:function a() {}单独存在时就是函数声明,否则是函数表达式。

证据(或说明)请参考语言规范。如下:

一. 首先,看一下函数声明()和函数表达式()的定义:

FunctionDeclaration :

    function Identifier ( FormalParameterList[opt] ) { FunctionBody }


FunctionExpression :

    function Identifier[opt] ( FormalParameterList[opt] ) { FunctionBody }

可见,但从语法形式上,两者几乎是完全一样的。唯一区别是,作为函数表达式时,标识符是可选的。


二. 函数声明只能单独使用,是一个与声明(statement)同级别的语法单元:


Program :

    SourceElements[opt]

SourceElements :

    SourceElement

    SourceElements SourceElement

SourceElement :

    Statement

    FunctionDeclaration

三. 而函数表达式作为一个``,是只能作为其他表达式的一部分使用,不能单独存在的:


MemberExpression :

    PrimaryExpression

    FunctionExpression

    MemberExpression [ Expression ]

    MemberExpression . IdentifierName

    new MemberExpression Arguments

OK,这就很清楚了。


查看完整回答
反对 回复 2019-03-20
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

赋值运算的返回值等于等号右边的返回值,a = function(){} 的返回值就是function 的引用地址。a = b =function(){}; a===b//true


查看完整回答
反对 回复 2019-03-20
  • 5 回答
  • 0 关注
  • 685 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信