[翻译]函数:声明和表达式

对着背影说爱祢 提交于 2019-12-25 15:14:14

  昨天看了一篇文章《命名函数表达式探秘》,但我对函数表达式和声明之间的区别还是不太清楚,所以查了些资料,翻译了这篇文章

  文章很基础,但是讲的很清晰。

  以下译文:

  

函数:声明和表达式

函数,像变量一样,可以在代码的任意地方定义它。
JS 提供了几个方法去定义它们。
     1.函数声明     (Function Declaration)
     2.函数表达式  (Function Expression)
     3.通过调用new Function 返回。

语法
     创建一个函数的基本方法是通过一个函数声明。语法如下:
     
function f(arg1, arg2, ...) {
   ... code ...
}
     
     实现起来像这样子:
          
1 function sayHi(name) {
2   alert("Hi, "+name)
3 }
4  
5 sayHi('John')
     
     上面的例子声明了一个带有一个参数name,函数名为sayHi的函数,并且调用了它。

返回值

     我们用return语句来返回一个值。
     
1 function sum(a, b) {
2   return a+b
3 }
4  
5 var result = sum(2,5)
6 alert(result)

     如果函数不返回任何东西,它的结果 会是一个特殊的值,undefined。你可以从下面的代码看到。

     
1 function getNothing() {
2   // no return
3 }
4  
5 var result = getNothing()
6  
7 alert(result)
     
     一个空的返回也是一样:
     
1 function getNothing() {
2   return
3 }
4 alert( getNothing() === undefined ) // true

局部变量

     一个函数可以包括变量,通过var来定义。这些变量被称为局部变量,而且只能在函数内部使用。
     
1 function sum(a, b) {
2   var sum = a + b
3  
4   return sum
5 }

函数声明

     函数的声明的解析是在预执行(pre-execution)阶段,也就是浏览器准备执行代码的时候。
     
     因此,通过函数声明来定义函数,可以在定义前或后被调用。
     
     下面的代码是可以跑的:

     
1 function sayHi(name) {
2   alert("Hi, "+name)
3 }
4  
5 sayHi("John")

     换个顺序也可以:
     
     
1 sayHi("John")
2  
3 function sayHi(name) {
4   alert("Hi, "+name)
5 }

     一个函数可以在代码任意位置声明。

     


比如,我们可能要根据条件来声明不同的函数:

1 sayHi()
2  
3 if (1) {
4   function sayHi() {  alert(1)  }
5 else {
6   function sayHi() {  alert(2)  } // <--
7 }
在写这篇文章的时候(作者本人没有给出他这这篇文章的时间——译者注),尝试在不同浏览器,火狐会抛出异常,其他两个浏览器都会给出结果 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 + "!");
3 }

     

'function' 关键字什么时候用作 表达式,什么时候又用作 声明

规则很简单

当js解析器看到function出现在主码流( main code flow 不知如何翻译),function被认为是声明。

当 function 作为语句(statement)的一部分出现的,都会是表达式。

(译者认为,可以看能不能加分号来判断,能加分号的都为语句(statement)。)
     函数表达式会在执行流( execution flow)执行到它的时候才会创建函数。所以,函数表达式必须被执行了(此时函数才定义了)才能被调用。

     
01 var sayHi
02  
03 // sayHi() <-- can't call here, there is no sayHi yet
04  
05 if (1) {
06   sayHi = 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!