我们可以用两种方式编写函数:
var v1 = m1('hello'); // error
var v2 = m2('hello'); // OK
var m1 = function(param){
// ...
return param;
}
function m2(param){
// ...
return param;
}
var v1 = m1('hello'); // OK
var v2 = m2('hello'); // OK
据我所知,只有一个区别 - 创作时间:
编译时m2
,所以我们可以在'声明'之前使用它 - 就像在我的情况下一样
分配时间m1
(代码逐行),我们以前不能使用它。
记忆或表现更有效吗?
在哪种情况下是一种更加语义的方式,在这种情况下是第二种方式
这是下一个区别吗?
我们应该先使用还是第二次使用?
// 编辑非常原始的性能测试 - 相同的结果
// http://jsperf.com/performance-function-writing-way
答案 0 :(得分:1)
var m1 = function(param){ // ... 返回参数; }
当你认为函数是一个对象时,它可能更有意义,我们只是为对象指定一个名称。把它想象成var m1 = [1,2,3];以这种方式声明的函数的内容也被编译。当分配这样的函数时,我们不限于一个未命名的函数,我可以通过名称或变量来引用该函数。
有关详细信息,您必须查看本文...
答案 1 :(得分:1)
以下函数的名称为m1
。它作为m1
存储在当前范围中。无论代码顺序如何,都可以在此范围内随处访问。
function m1(){}
以下功能没有名称。它作为m2
存储在当前范围中。它只能在它之后的行中访问。
var m2 = function(){}
您还可以将命名函数分配给其他变量:
var m1 = m2;
function m2(){}
var m3 = function m4(){};
var m5 = function(){};
在Firefox的控制台中:
>>> m1
m2()
>>> m2
m2()
>>> m3
m4()
>>> m4
ReferenceError: m4 is not defined
>>> m5
function()
答案 2 :(得分:1)
如果您只希望按特定名称提供功能,则最小的方法是在不分配的情况下进行写入。仅仅因为你不需要执行额外的操作并编写额外的代码,你只需要有一个你可以调用的函数。
您编写的分配方式是使用匿名函数的示例,实际上并非需要匿名函数的情况。使用此功能的一个示例是,您可以将操作作为参数传递给某些函数。看看this page of jQuery docs on hide
。此函数接受两个参数:动画的长度以及完成后要执行的操作。您可能不需要在其他地方执行该操作,那么为什么要创建另一个标识符并使您的命名空间混乱?可能有原因,但这些都超出了这个问题的范围。
JS语法允许两者,但这是JS中可用的匿名函数的副作用。
所以这是一个选择和习惯的问题。