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

进入误区,请帮忙解答

函数调用表达式
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(){} 后就是表达式了呢?是的话应该肯定返回一个值吧。那值是什么呢?

阅读 4k
6 个回答

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

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

  • 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引擎在解析时会依据函数的定义形式不同而做出不同的解析,其中仅会在函数定义不作为任何子表达式存在时才是函数声明,否则就会把该函数的定义当做函数表达式来解析。

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

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

上面的代码等同于

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

同理:

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

谢邀。
简单地说,这是语言规范规定的: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,这就很清楚了。

其实没有那么复杂.举个例子
function fn(){} 这就是声明一个函数. 调用函数就是 fn();
如果函数体内返回了值,那么可以创建变量接收,也可以不接收; 例如 var a = fn(); fn有return,那么a就等于返回值,没有就是undefined.

var a = function (){} 这是函数创建的另外一种方法. 那这个函数不会执行, 还得自己调用.
a(); 调用函数. 函数返回不返回值,和这两种方式创建函数无关.
var b = a(); b就是函数执行返回的值.

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

新手上路,请多包涵

函数声明是这样的 function fn(){};
表达式是这样的 var fn = function(){};

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题