我目前正在学习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 :(得分:21)
通常我只会在以后需要重新定义该功能的动作时使用var funcName = function(){}
。例如:
var foo = function(a){ return a * 2; }
var bar = foo(2);
foo = function(a){ return a / 2; }
bar = foo(bar);
否则,在大多数情况下(假设它不是回调或修饰符)通常可以接受“经典”声明一个函数。
答案 1 :(得分:11)
我默认使用非变量function onReq(){}
版本。这不是我做出的一个有说服力的决定,但是考虑它会产生这些论点:
onReq
将始终引用那个函数体 - 在阅读代码时要少考虑一件事。类似于在Java中将变量标记为final
。答案 2 :(得分:3)
这是一个解释:
函数名称和函数分配给的变量之间存在区别:
https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope
答案 3 :(得分:1)
根据John Resig的JavaScript as a First Language文章,您的第一个代码块被视为最佳做法。
答案 4 :(得分:1)
在IE的某些版本(很可能是IE8或更低版本)中使用非变量语法时,我个人遇到了调用局部函数(在其他函数中声明的函数)的某些问题,而变量语法确实按预期工作。
鉴于函数不应该在全局命名空间中被解析,大多数函数都是本地的,因此总是使用函数的变量语法是有意义的。
答案 5 :(得分:0)
我在这里看到了一些不同的意见,但大多数意见更多的是基于你认为好或不好的东西,但我不知道何时使用其中一个或另一个的技术原因,但肯定有使用一种声明公式或其他的技术限制或优点。我真的是一个使用javascript的初学者而且我不自信地就此提出建议,但我会提出一个案例,其中在变量中存储函数不起作用。
在下面的代码中,定义一个Angular过滤器,如果我在变量中定义了函数,那么我就无法从过滤器方法中成功调用它。有人能解释一下这个技术原因吗?
查看代码(评论不起作用):
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 "?";
}
};
};
*/
提前谢谢!
答案 6 :(得分:0)
我看到没有人提到(直接和实际上-这似乎是关于这个问题的)我个人认为对将函数存储在变量中最有用的原因。该原因是在处理复杂的逻辑,该逻辑需要很多选择(例如if
)来确定应调用不同功能(可能也具有不同输入集)的进一步操作过程。在逻辑的最后,如果只在一个地方启动进一步的操作,它将使代码更整洁。
function fooA (input) {...};
function fooB (input) {...};
let chosenHandler;
let chosenInput;
// Here we establish which function is relevant
if (someCondition) chosenHandler = fooA;
else chosenHandler = fooB;
// Here we establish which parameter should be used
if (someOtherCondition) chosenInput = 'First input';
else chosenInput = 'Second input';
// Call chosen function with chosen parameters - one place, nice and clean
chosenHandler(chosenInput);
如果我们尝试直接调用函数,则代码将变得更加混乱,并且逻辑越复杂,则混乱的程度就越大。