当我使用"传统"C风格的函数声明时,JavaScript中发生了什么?

Ham*_*ite 9 javascript function

我知道有几种方法可以在JavaScript中定义一个函数.其中两个最常见的是:

(1)  function add (a, b) {
         return a + b;
     }

(2)  var add = function (a, b) {
         return a + b;
     }
Run Code Online (Sandbox Code Playgroud)

我觉得将函数作为一个对象的想法可以像任何其他变量一样传递.所以我完全理解(2)正在做的事情.它正在创建一个函数并分配给add(假设这是全局范围,因此add是全局变量)所述函数.但是如果我改用的话会发生什么(1)呢?我已经知道它在执行顺序上有所不同:如果我使用(1)那么我可以add()在代码中add()定义的点之前引用,但是如果我使用(2)那么我必须add在我开始引用之前分配我的函数add().

(1)这个的快捷方式(2),虽然一个出现这种情况的行为像其他C风格的语言,使我们能确定它是用来在其"下"点的功能?或者它内部是一种不同类型的功能?哪个更符合JavaScript的"精神"(如果这个术语不是太模糊)?你会把自己限制在一个或另一个,如果是这样的话?

Dan*_*llo 6

看起来您已经了解了函数声明 1(1)和函数表达式(2)的主要特征.另请注意,在(1)中仍然有一个名为add包含函数值的局部变量,就像在(2)中一样:

function hello () {
   alert('Hello World');
}

console.log(typeof hello);  // prints "function"

setTimeout(hello, 1000);    // you can still pass functions around as arguments,
                            // even when using function declarations.
Run Code Online (Sandbox Code Playgroud)

值得一提的另一点是函数声明(1)不应该用于有条件地定义函数(例如在if语句中),因为正如您所提到的,它们会被JavaScript解释器2自动移动到包含范围的顶部..这通常被称为吊装.

至于哪种方法更符合JavaScript的精神,我更喜欢使用函数表达式(2).对于一个更权威的意见,道格拉斯克罗克福德列出了他的受欢迎"坏零件"一章函数声明(1)好的部分书2.


1也称为函数语句(请参阅下面的@Tim Down的评论).
2其实有些浏览器能够处理函数声明if语句(再提意见如下图).
3 JavaScript:好的部分 - 附录B:第113页.

  • 根据ECMAScript规范,`if`语句块内的函数声明是语法错误.没有主流浏览器抛出错误,可能是因为IE和Mozilla设置的先例.Mozilla通过在ECMAScript中加入一个名为`FunctionStatement`的扩展来解决这个问题(http://www.jibbering.com/faq/#functionStatement,http://kangax.github.com/nfe/#function-statements).JScript对规范的尊重程度较低,而且内部也知道上帝知道什么. (2认同)