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