Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.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—将函数声明为变量是一个明智的想法吗?_Javascript_Function_Variables_Call_Anonymous - Fatal编程技术网

JavaScript—将函数声明为变量是一个明智的想法吗?

JavaScript—将函数声明为变量是一个明智的想法吗?,javascript,function,variables,call,anonymous,Javascript,Function,Variables,Call,Anonymous,正如标题所提到的。如果您关心性能,将函数声明为变量是否明智?例如,在这个场景中:我正在创建一个函数,它将被反复调用x。此函数包含一对变量,不接受参数。其中一个变量包含匿名函数,每次调用父变量时,都会调用该变量/函数 因此基本上结构如下所示: function myFunction() { var foundElements = document.querySelectorAll("*"), updateElements = function() { console.

正如标题所提到的。如果您关心性能,将函数声明为变量是否明智?例如,在这个场景中:我正在创建一个函数,它将被反复调用x。此函数包含一对变量,不接受参数。其中一个变量包含匿名函数,每次调用父变量时,都会调用该变量/函数

因此基本上结构如下所示:

   function myFunction() {
  var foundElements = document.querySelectorAll("*"),
    updateElements = function() {
      console.log("Hello world, i've been called to work as a slave!");
    };

  if (foundElements.length > 0) {
    updateElements();
  }
}
将此函数声明为命名/分离函数是否更好?还是这条路要走?(因为我认为这种方法会导致系统在每次调用父函数时重新创建函数,如果我错了,请纠正我)

提前谢谢

因为我认为这个方法会导致系统重新创建函数 每次打电话给家长,如果我错了,请纠正我

我不确定javascript编译器是如何工作的,但我怀疑它们是否在每次调用“父”时都编译该函数。至少,如果我编写一个编译器,它会将编译后的函数存储在缓存中,并每次使用该缓存

无论如何,编译javascript函数不会导致性能问题,因为它非常便宜。访问DOM要昂贵得多,所以如果我是你,我会担心
document.querySelectorAll(“*”
部分,尤其是
*
部分

因为我认为这个方法会导致系统重新创建函数 每次打电话给家长,如果我错了,请纠正我

我不确定javascript编译器是如何工作的,但我怀疑它们是否在每次调用“父”时都编译该函数。至少,如果我编写一个编译器,它会将编译后的函数存储在缓存中,并每次使用该缓存


无论如何,编译javascript函数不会导致性能问题,因为它非常便宜。访问DOM要昂贵得多,所以如果我是你,我会担心
文档。querySelectorAll(“*”
部分,尤其是
*
部分…

是的,创建新函数实例确实会有一些可测量的开销。这种开销是否会对实际代码产生任何影响完全是另一回事

例如,考虑一个简单的基准,它以各种或多或少的低效方式切换布尔标志:

var-suite=newbenchmark.suite;
var标志=真;
suite.add('baseline',function()){
flag=!flag;
});
suite.add('localhelper function',function()){
var f=函数(x){return!x};
flag=f(flag);
});
var g=函数(x){return!x};
suite.add('externalhelper function',function(){
flag=g(flag);
});
console.log('Running benchmark on'+benchmark.platform.description);
on('cycle',function(event){console.log('-'+event.target)});
suite.on('complete',function(){console.log('faster is'+this.filter('faster').map('name'))});
run({'async':true})

是的,创建一个新的函数实例确实有一些可测量的开销。这种开销是否会对实际代码产生任何影响完全是另一回事

例如,考虑一个简单的基准,它以各种或多或少的低效方式切换布尔标志:

var-suite=newbenchmark.suite;
var标志=真;
suite.add('baseline',function()){
flag=!flag;
});
suite.add('localhelper function',function()){
var f=函数(x){return!x};
flag=f(flag);
});
var g=函数(x){return!x};
suite.add('externalhelper function',function(){
flag=g(flag);
});
console.log('Running benchmark on'+benchmark.platform.description);
on('cycle',function(event){console.log('-'+event.target)});
suite.on('complete',function(){console.log('faster is'+this.filter('faster').map('name'))});
run({'async':true})

我同意是的,你应该读更多关于这一点的内容:除非x是几十万量级的东西,否则不存在可测量的差异(即使这样也不会有实际的差异)。这不会成为这里的瓶颈。例如,一个
querySelectorAll()
调用可能比任何差异都慢数百万倍。@Juhana但是如果该函数是一个子(必需)函数,如果当前元素与我的if要求不匹配,可以再次调用该函数,那该怎么办呢。那么只为这个函数创建一个命名函数(让它正常工作)会有点愚蠢,对吗?@roberrt谢谢你的文章我真的不明白你在说什么,但是让它正常工作听起来一点也不愚蠢。关键是这不是性能问题。我同意,是的,你应该读更多关于这方面的内容:除非x是几十万量级的东西,否则不存在可测量的差异(即使这样,也不会有实际的差异)。这不会成为这里的瓶颈。例如,一个
querySelectorAll()
调用可能比任何差异都慢数百万倍。@Juhana但是如果该函数是一个子(必需)函数,如果当前元素与我的if要求不匹配,可以再次调用该函数,那该怎么办呢。那么只为这个函数创建一个命名函数(让它正常工作)会有点愚蠢,对吗?@roberrt谢谢你的文章我真的不明白你在说什么,但是让它正常工作听起来一点也不愚蠢。关键是这不是一个性能问题。还有更重要的事情需要优化。一些javascript实现可能会在每次函数调用时编译。这取决于闭包是如何实现的。但是对于程序员来说,它必须看起来像是每个cal编译函数一样工作