昨天看了一篇文章《命名函数表达式探秘》,但我对函数表达式和声明之间的区别还是不太清楚,所以查了些资料,翻译了这篇文章。
文章很基础,但是讲的很清晰。
以下译文:
函数:声明和表达式
函数,像变量一样,可以在代码的任意地方定义它。
JS 提供了几个方法去定义它们。
1.函数声明 (Function Declaration)
2.函数表达式 (Function Expression)
3.通过调用new Function 返回。
语法
创建一个函数的基本方法是通过一个函数声明。语法如下:
function f(arg1, arg2, ...) { |
实现起来像这样子:
上面的例子声明了一个带有一个参数name,函数名为sayHi的函数,并且调用了它。
返回值
我们用return语句来返回一个值。
如果函数不返回任何东西,它的结果 会是一个特殊的值,undefined。你可以从下面的代码看到。
1 | function getNothing() { |
5 | var result = getNothing() |
一个空的返回也是一样:
1 | function getNothing() { |
4 | alert( getNothing() === undefined ) // true |
局部变量
一个函数可以包括变量,通过var来定义。这些变量被称为局部变量,而且只能在函数内部使用。
函数声明
函数的声明的解析是在预执行(pre-execution)阶段,也就是浏览器准备执行代码的时候。
因此,通过函数声明来定义函数,可以在定义前或后被调用。
下面的代码是可以跑的:
换个顺序也可以:
一个函数可以在代码任意位置声明。
比如,我们可能要根据条件来声明不同的函数:
4 | function sayHi() { alert(1) } |
6 | function sayHi() { alert(2) } // <-- |
在写这篇文章的时候(作者本人没有给出他这这篇文章的时间——译者注),尝试在不同浏览器,火狐会抛出异常,其他两个浏览器都会给出结果 2。
这是因为声明是在代码执行前解析的。根据规范(p.10.5),后面函数会覆盖前面存在的同名函数。
到了执行时期,声明会被忽略。所以if语句没有起作用。
函数表达式
在JS里面,函数function和number、string一样,是一阶值(原文为:first-class value,有人也译作:‘一等公民’)
只要可以放置变量的地方,都可以放置函数。在那个‘地方’用函数表达式的语法来声明:function (arguments) {}
例如,你可以这样使用变量:
var
f = 5
也可给f赋值一个函数表达式:
1 | var f = function (name) { |
2 | alert( "Hi, " + name + "!" ); |
'function' 关键字什么时候用作 表达式,什么时候又用作 声明?
规则很简单
当js解析器看到function出现在主码流( main code flow 不知如何翻译),function被认为是声明。
当 function
作为语句(statement)的一部分出现的,都会是表达式。
(译者认为,可以看能不能加分号来判断,能加分号的都为语句(statement)。)
函数表达式会在执行流( execution flow)执行到它的时候才会创建函数。所以,函数表达式必须被执行了(此时函数才定义了)才能被调用。
03 | // sayHi() <-- can't call here, there is no sayHi yet |