3

我们可以通过两种方式编写函数:

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

4

3 回答 3

1

var m1 = function(param){ // ... 返回参数;}

当您认为函数是一个对象时,它可能更有意义,而我们只是为该对象分配一个名称。把它想象成 var m1=[1,2,3]; 以这种方式声明的函数的内容也会被编译。

当像这样分配一个函数时,我们并不局限于一个未命名的函数,我可以通过名称或变量来引用函数。

有关更多信息,您必须查看这篇文章...

http://www.permadi.com/tutorial/jsFunc/index.html

于 2013-09-27T08:02:39.287 回答
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()
于 2013-09-27T08:49:54.437 回答
1

如果您只希望有一个可通过特定名称使用的函数,那么最简单的方法是不赋值。仅仅因为您不需要执行额外的操作和编写额外的代码,您只需要一个可以调用的函数。

您编写的赋值方式是使用匿名函数的示例,实际上并不需要匿名函数。此功能的一个示例使用是您可以将操作作为参数传递给某些函数。看看这个页面上的 jQuery 文档hide。此函数接受两个参数:动画的长度和完成后要执行的操作。您可能在其他任何地方都不需要该操作,那么为什么要创建另一个标识符并弄乱您的命名空间呢?可能有原因,但这些超出了这个问题的范围。

JS 语法允许两者,但这是在 JS 中提供匿名函数的副作用。

所以这是一个选择和习惯的问题。

于 2013-09-27T09:08:35.440 回答