2012-03-08 123 views
30

我正在学习JavaScript,我不太明白什么时候写一个函数到变量中。什么时候应该将函数存储到变量中?

例如,以下两个代码块的做同样的事情的Node.js:

var onReq = function(req, res) { 
    res.write('Hello'); 
}; 

http.createServer(onReq).listen(3000); 

function onReq(req, res) { 
    res.write('Hello'); 
} 

http.createServer(onReq).listen(3000); 



这是根据最好做的最好的方法做法,为什么?

+0

对于这个问题,你需要对字符串变量和整数更加集中和浮点变量; – 2012-03-08 13:47:29

+0

http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip – jbabey 2012-03-08 14:06:23

+0

重复:http://stackoverflow.com/questions/336859/JavaScript的VAR-functionname功能-VS-功能functionname – 2012-03-08 14:12:52

回答

18

通常我只会使用var funcName = function(){}当我需要重新定义该函数后面的操作时。例如:

var foo = function(a){ return a * 2; } 
var bar = foo(2); 

foo = function(a){ return a/2; } 

bar = foo(bar); 

否则,对于大多数用途(假定它不是一个回调或改性剂)声明一个函数“经典”通常是可接受的。

+0

我明白你的意思,但它仍然是更好地做到声明函数的我说右的前一种方法? – imjp 2012-03-08 13:50:12

1

根据John Resig的JavaScript as a First Language文章,您的第一个代码块被认为是最佳实践。

+4

不要太受那个影响。有很多时候使用函数声明更可取,并利用它被提升到代码顶部的事实。可悲的是,他建议'//不要这样做:函数getData(){}'因为它可以更容易地将函数作为对象来教授。让教学更容易是一个很差的理由,让初学者开始思考它有什么问题。 – 2012-03-08 14:30:24

3

下面是一个交代:

有功能被分配给该函数名和变量之间的区别:

  • 函数名称不能被改变,而可变的功能分配可以重新分配。
  • 函数名称只能在函数体内使用。试图在函数体外使用它会导致错误(如果函数名称以前是通过var语句声明的,则会导致错误)。

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

+0

只是一个快速的附录。 fn声明中的函数名称(如MDN使用的术语)可以更改 - 只需将其分配给新变量即可获得对该函数的另一个引用。稍后在代码中,函数名称也可以重新分配给另一个函数(或其他函数)。另一个区别是函数声明会将分配提升到范围的顶部,而使用变量只会提升变量的声明。 – meloncholy 2012-03-08 14:12:17

+0

你的观点都不正确。对于第一个,你很难看到你在说什么,但在这两种情况下,引用该函数的变量都可以被重新分配。第二点是不正确的。如问题所示,函数名称可以在函数体外部使用。您正在考虑命名的函数表达式,该问题中未显示。 – 2012-03-08 14:20:15

+0

通过以上重复链接之一,kangax的[命名函数表达式揭秘](http://kangax.github.com/nfe/)更详细地涵盖了这一点,并且有更多的微妙之处(例如,指出我的评论在提升行为上实际上可能会因浏览器而异)。绝对值得一试。 – meloncholy 2012-03-08 14:36:52

10

我默认为不可变的function onReq(){}版本。这不是我做出的一个明智的决定,但考虑它会产生这些论点:

  • 它看起来更干净。
  • 它在概念上更简单:它只是一个函数,而另一个是函数和变量。这是一件小事,但我认为它是有价值的。
  • 它保证我onReq将始终指代函数体 - 阅读代码时要考虑的一件事。有点像在Java中将变量标记为final
  • 使我免于“意外”更换功能,导致其他地方出现意想不到的副作用。
1

我个人也遇到了一些问题,在IE浏览器的一些版本使用时不可变的语法(最有可能IE8或更低),而变量语法做工作按预期调用本地函数(其它函数内部声明函数)。

鉴于函数不应该在全局命名空间中被降级,大多数函数都是局部函数,因此总是对函数使用可变语法是有意义的。

0

我在这里看到了一些不同的意见,但其中大部分的更多地是基于你认为是好是坏,但我没有看到关于何时使用一个或另一个,技术上的原因,但肯定也有技术使用一种声明公式或其他的限制或优点。我真的是一个JavaScript的初学者,我不觉得有信心提供建议,但我会提出一个在变量中存储函数不起作用的情况。

在下面的代码,限定角滤波器,如果我定义一个变量内的功能,那么我不能成功地从过滤器的方法调用它。任何人都可以解释我的技术原因吗?

看到的代码(评论是不工作):

angular 
    .module('loc8rApp') 
    .filter('formatDistance', formatDistance); 

function formatDistance(){ 
     return function (distance) { 
     var numDistance, unit; 
     if (distance && _isNumeric(distance)) { 
     if (distance > 1) { 
      numDistance = parseFloat(distance).toFixed(1); 
      unit = 'km'; 
      } else { 
      numDistance = parseInt(distance * 1000,10); 
      unit = 'm'; 
      } 
      return numDistance + unit; 
     } else { 
      return "?"; 
     } 
     }; 
}; 

var _isNumeric = function (n) { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
}; 

/* 
var formatDistance = function() { 
    return function (distance) { 
    var numDistance, unit; 
    if (distance && _isNumeric(distance)) { 
     if (distance > 1) { 
     numDistance = parseFloat(distance).toFixed(1); 
     unit = 'km'; 
     } else { 
     numDistance = parseInt(distance * 1000,10); 
     unit = 'm'; 
     } 
     return numDistance + unit; 
    } else { 
     return "?"; 
    } 
    }; 
}; 
*/ 

预先感谢您!

相关问题