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的"精神"(如果这个术语不是太模糊)?你会把自己限制在一个或另一个,如果是这样的话?
看起来您已经了解了函数声明 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页.