写作函数的语义

时间:2013-09-27 07:50:16

标签: javascript semantics

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

有关详细信息,您必须查看本文...

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

答案 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中可用的匿名函数的副作用。

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