Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点js中编写命名函数是否更有效?_Javascript_Node.js - Fatal编程技术网

Javascript 在节点js中编写命名函数是否更有效?

Javascript 在节点js中编写命名函数是否更有效?,javascript,node.js,Javascript,Node.js,我正在NodeJS中开发一个应用程序。我使用匿名函数进行回调。然后我参考了我发现编写命名函数是最好的编码方式的网站 但当我开始以命名函数格式编写代码时,我的代码行数增加了,函数数也增加了。为每个回调编写命名函数是否更好 性能方面哪一个更好?虽然您可以在代码中添加更多行,但函数声明是最快的。这尤其适用于多次调用同一函数的实例。例如集合查找、数组迭代等 使用,您可以快速看到差异 ☃ seth:~/Node/function-performance$ node test.js Anonymous x

我正在NodeJS中开发一个应用程序。我使用匿名函数进行回调。然后我参考了我发现编写命名函数是最好的编码方式的网站

但当我开始以命名函数格式编写代码时,我的代码行数增加了,函数数也增加了。为每个回调编写命名函数是否更好


性能方面哪一个更好?

虽然您可以在代码中添加更多行,但函数声明是最快的。这尤其适用于多次调用同一函数的实例。例如集合查找、数组迭代等

使用,您可以快速看到差异

☃ seth:~/Node/function-performance$ node test.js
Anonymous x 121 ops/sec ±8.31% (64 runs sampled)
Function Expression x 137 ops/sec ±5.25% (72 runs sampled)
Function Declaration x 165 ops/sec ±0.84% (86 runs sampled)
Fastest is Function Declaration
这是使用以下代码进行测试:

"use strict";

var Benchmark = require('benchmark')
var suite = new Benchmark.Suite

var stuff = [1,2,3,4,5,6,9,8,9,10,11,12,13,14,15];

var myEventHandler = function() {
  // do something
};

function myEventHandler2() {
  // do something
};

suite.add('Anonymous', function() {
  for (var i = 0; i < 10000; ++i) {
    stuff.forEach(function() {
      // do something
    });
  }
})
.add('Function Expression', function() {
  for (var i = 0; i < 10000; ++i) {
    stuff.forEach(myEventHandler);
  }
})
.add('Function Declaration', function() {
  for (var i = 0; i < 10000; ++i) {
    stuff.forEach(myEventHandler2);
  }
})
.on('cycle', function(e) {
  console.log(String(e.target))
})
.on('complete', function() {
  console.log('Fastest is ' + this.filter('fastest').pluck('name'))
})
.run({ 'async': true });
“严格使用”;
var Benchmark=require(‘基准’)
var suite=新的Benchmark.suite
var stuff=[1,2,3,4,5,6,9,8,9,10,11,12,13,14,15];
var myEventHandler=函数(){
//做点什么
};
函数myEventHandler2(){
//做点什么
};
suite.add('Anonymous',function(){
对于(变量i=0;i<10000;++i){
stuff.forEach(函数(){
//做点什么
});
}
})
.add('函数表达式',函数()){
对于(变量i=0;i<10000;++i){
福雷奇(myEventHandler);
}
})
.add('函数声明',函数()){
对于(变量i=0;i<10000;++i){
stuff.forEach(Myeventhandle2);
}
})
.on('循环',功能(e){
console.log(字符串(例如目标))
})
.on('complete',function(){
console.log('faster is'+this.filter('faster')。pull('name'))
})
.run({'async':true});
同样的道理也适用于美国


为了支持Zeeker的评论,如果在给定实例中没有多次运行函数,通常可以使用匿名函数,但它可以在使用函数声明时清理调用。

取决于上下文;如果是短的单行回调,不要使用命名函数,对于大型回调,使用命名函数更好。这也很大程度上受您的编码风格的影响。感谢@Zeeker的快速响应。我更喜欢简短的一行调用的建议,但匿名函数和编写命名函数之间是否有性能差异。没有性能差异。@Abhijeet:如果您不需要闭包,并且可以在使用函数的外部声明函数,不使用函数表达式可能会有性能差异。为什么测试代码创建匿名函数,但调用声明和全局表达式?您确实应该使用严格模式,它会引发未声明的
myEventHandler
变量。这一点很好。我从一个浏览器实现移植了这个,没有更新这个示例。我更新了示例以反映函数接受回调的实例。此外,由于示例中没有变量冲突,因此全局变量不是问题。不过我还是更新了。谢谢!全局变量的问题不是可能的冲突,而是它们的访问速度要慢得多(与本地声明相比),值得指出的是,除了性能差异之外,命名函数在堆栈跟踪中更具可读性。