5 回答
TA贡献1804条经验 获得超8个赞
本来这么基础的问题是不想回答的,但是看了前面几个回答,感觉不少人对表达式这个基础知识点可能还不是完全理解,所以就简单写一下吧。
什么是表达式?表达式是用运算符连接的一个或多个值、变量、函数及其他运算数所形成的式子。
fn()
这是一个函数调用表达式,因为()
是函数调用运算符(去查一下运算符有哪些就知道了)a = function() {}
这是一个复合表达式,它由a
、function() {}
两个子表达式和一个赋值运算符组成。但是注意var a = function() {};
不是一个表达式,而是一个语句,因为它包含var
和分号,它们都不是运算符b = 1
和var b = 1;
与上一条相同
不解的是 函数表达式以上为例。function() {} 就不是表达式?而a = function() {}这样就是表达式了呢?
首先,为什么单独写function a() {}
不是表达式?
这是因为这句代码“声明”了一个名为a
的函数。在解析的时候,JS引擎会对这种形式的函数声明做一些特殊处理,比如声明提升。
用一句不太严格的话来解释,函数声明类似于整条语句var a = function() {};
,只是JS引擎在遇到这么一个声明的时候会自动对其进行提升。前面已经解释过这种形式的语句不是表达式。
那为什么a = function() {}
是一个表达式呢?
在JS中,函数是一等公民,可以像其他值和变量那样赋值、传递,这个表达式右边正是这么一个函数类型的值。甚至你还可以这么写:a = function a() {}
,右边看起来与前面的函数声明更像了,但这仍然是一个表达式,因为在JS中,匿名函数也可以指定一个名字。
因此关于这一点,总结下来就是:JS引擎在解析时会依据函数的定义形式不同而做出不同的解析,其中仅会在函数定义不作为任何子表达式存在时才是函数声明,否则就会把该函数的定义当做函数表达式来解析。
TA贡献2037条经验 获得超6个赞
你这儿就是典型的理解过度。给你一段代码,自己领悟吧
var a; //声明一个变量 这里是一个声明
a = 13; //变量赋值
上面的代码等同于
var a = 13; //声明变量并赋值 这里是一个表达式
同理:
function a(){ //这里一个声明
}
var a = function(){ //这里是一个表达式
}
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,这就很清楚了。
TA贡献1836条经验 获得超13个赞
添加回答
举报