细说 Javascript 函数篇(一) : 函数声明和函数表达式

functionJavascript 中的第一类对象,这就意味着函数能够像其他值一样被通报。一个最常见的用法就是将一个匿名函数作为回调函数通报到别的一个异步函数中。

函数声明

function foo() {}

函数 foo 将会在全部顺序执行前被 hoist (提拔),因而它在定义 foo 函数的全部 scope (作用域)中都是可用的。纵然在函数定义之前挪用它也没问题。

foo(); // Works because foo was created before this code runs
function foo() {}

因为我盘算特地写篇引见作用域的博文,所以这里就不详述了。假如对 scopehoist 有迷惑,可用浏览 @nightire 凡哥的博文 – 《明白 JavaScript(二)》,内里细致引见了 scopehoist 的寄义和用法。

函数表达式

关于函数声明,函数的称号是必需的,而关于函数表达式而言则是可选的,因而,就涌现了匿名函数表达式和定名函数表达式。以下:

  • 函数声明: function functionName (){ }
  • 函数声明: function functionName[可选](){ }

那末我就晓得,假如没有函数名的话,肯定就是函数表达式,然则关于有函数名的状况该怎样推断呢?
Javascript 划定假如全部函数体是作为表达式的一部分时,那末它就是函数表达式,不然等于函数声明。以下为表达式:

var fuc = foo(){}

我们再举几个极度的表达式例子:

!function foo(){}
true && function foo(){}

以上的语句这里只是为了辨别函数表达式,平常不会如许写。那末用一个对照的例子来看看结果:

foo1();//foo1 is not defined 
foo2();//works because foo2 was created before this code runs
!function foo1() {
    alert('foo1 works');
};
function foo2() {
    alert('foo2 works');
};

匿名函数表达式

var foo = function() {};

上面的例子将一个匿名函数赋值给了变量 foo。

foo; // 'undefined'
foo(); // this raises a TypeError
var foo = function() {};

因为 var 是一个声明所以这里对变量 foo 举行 hoist (提拔),因而当顺序执行时,变量 foo 是可挪用的。
然则因为赋值语句只要在运行时才见效,所以变量 foo 的值为 undefined

定名函数表达式

另一个要讲到的就是定名函数的赋值。

var foo = function bar() {
    bar(); // Works
};
bar(); // ReferenceError

在这里,定名函数 bar 赋值给了变量 foo,所以在函数声明外是不可见的,但在 bar 函数内部依然能够挪用。这是因为 Javascript 对定名函数处置惩罚的机制,函数的称号永远在函数内部的作用域中有用。

参考

http://bonsaiden.github.io/JavaScript-Garden/#function.general

    原文作者:StephenLee
    原文地址: https://segmentfault.com/a/1190000000482011
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞