当前位置: 首页 > 面试题库 >

箭头函数是否像命名函数一样进行了优化?

裴星洲
2023-03-14
问题内容

我在观看NodeJS
Interactive谈话时,那个家伙在说匿名函数的性能很差,原因之一是,如果它们没有名称,VM便无法根据使用频率来优化该函数,因为它没有名字。

因此,如果一个具有名称的函数被调用

random.Async('Blah', function randomFunc() {});

randomFunc 可以优化为以下功能:

random.Async('Blah', function(cb) {});

由于它是匿名的,无名的,因此不会进行优化。

所以我想知道箭头函数是否会做同样的事情,因为我认为您不能命名箭头函数

random.Async('Blah', (cb) => {});优化

编辑:寻找该人提及此话题的谈话链接,将向您报告。(这篇演讲是从前一段时间开始的,只是我从中想起的东西)

编辑找到视频:https :
//youtu.be/_0W_822Dijg?t=299


问题答案:

注意:不能完全确定这些是链接视频演示中讨论的模式比较。

在10000次迭代中,命名功能似乎在铬下的V8实现中完成最快。Arrow function似乎比匿名函数在更短的时间内返回结果。

在100000次迭代中,匿名函数在最短的时间内完成;64.51ms少于命名函数,而箭头函数比命名函数花费4902.01ms更多的时间。

    var len = Array.from({

      length: 100000

    })



     // named function

    function _named() {



      console.profile("named function");

      console.time("named function");



      function resolver(resolve, reject) {

        resolve("named function")

      }



      function done(data) {

        console.log(data)

      }



      function complete() {

        console.timeEnd("named function");

        console.profileEnd();

        return "named function complete"

      }



      function callback() {

        return new Promise(resolver).then(done)

      }



      return Promise.all(len.map(callback)).then(complete);

    }



     // anonymous function

    function _anonymous() {

      console.profile("anonymous function");

      console.time("anonymous function");



      return Promise.all(len.map(function() {

          return new Promise(function(resolve, reject) {

              resolve("anonymous function")

            })

            .then(function(data) {

              console.log(data)

            })

        }))

        .then(function() {

          console.timeEnd("anonymous function");

          console.profileEnd();

          return "anonymous function complete"

        })

    }



     // arrow function

    function _arrow() {

      console.profile("arrow function");

      console.time("arrow function");



      return Promise.all(len.map(() => {

          return new Promise((resolve, reject) =>

              resolve("arrow function")

            )

            .then((data) => {

              console.log(data)

            })

        }))

        .then(() => {

          console.timeEnd("arrow function");

          console.profileEnd();

          return "arrow function complete"

        })

    }



    _named().then(_anonymous).then(_arrow)

jsfiddle https://jsfiddle.net/oj87s38t/



 类似资料:
  • 不鼓励将箭头函数(“lambdas”)传递给 Mocha。Lambdas词法绑定 this,无法访问 Mocha 上下文。例如,以下代码将失败: describe('my suite', () => { it('my test', () => { // should set the timeout of this test to 1000 ms; instead will fail thi

  • ES6标准新增了一种新的函数:Arrow Function(箭头函数)。 为什么叫Arrow Function?因为它的定义用的就是一个箭头: x => x * x 上面的箭头函数相当于: function (x) { return x * x; } 在继续学习箭头函数之前,请测试你的浏览器是否支持ES6的Arrow Function: 'use strict'; ---- var f

  • 新的“胖箭头”符号还可以用更简单的方式来定义匿名函数。 请看下面的例子: console.log(x); incrementedItems.push(x+1); }); 计算一个表达式并返回值的函数可以被定义更简单: 下面代码与上面几乎等价: incrementedItems = items.map(function (x) { return x+1; 让我们在 验

  • 我有一个函数,我正在尝试转换为ES6中的新箭头语法。它是一个命名函数: 有没有办法给它一个没有var语句的名字: 显然,我只能在定义了这个函数之后才能使用它。大致如下: 在ES6中有没有一种新的方法可以做到这一点?

  • 主要内容:1.语法变化,2.带参数的箭头函数,3.带有默认参数的箭头函数,4.带有Rest参数的箭头函数,5.无括号的箭头函数,6.箭头函数的优点ES6中引入了箭头(Arrow)函数,它提供了一种更准确的JavaScript编写方法。 它们让我们能够编写较小的函数语法。 箭头函数的代码更具可读性和结构性。 箭头函数是匿名函数(没有名称且未与标识符绑定的函数)。 它们不返回任何值,并且可以在不使用关键字的情况下进行声明。 箭头函数不能用作构造函数。 箭头函数中的上下文是按词汇或静态方式定义的。 它

  • 我想知道如何在ReactJS上使用setTimeout(),因为我正在这样做: 它调用两次函数this.reqMaq()。 如何防止第一次通话?在时间结束后继续打电话? 这是组件: 谢谢你。