【问题标题】:How to convert an iife old ways function to an arrow function in a single line如何在一行中将 iife oldways 函数转换为箭头函数
【发布时间】:2020-12-05 23:56:36
【问题描述】:

你会如何转换:

(function(age) {return `your ${age}`;
})(10);

到箭头函数?我试过但没有用:

(const years = (age) => `your ${age}`)(10);

为什么不起作用,如果是因为 const?

还有一个例子,如果我做:

const marco= { name: 'marco ccc',
  say hi: function () {
  return 'something';
  }
}

如何将 sayHi 转换为箭头函数?

【问题讨论】:

  • 为什么要尝试命名箭头函数?你不会在 iife 版本中这样做。
  • 为什么要这样做?特别是在对象方法的情况下?这真的没有意义。
  • console.log(((age) => 你的年龄是 ${age}) (10));
  • 我正在尝试了解如何正确转换带有箭头函数的调用函数表达式,然后再次将对象上的函数转换为箭头函数。学习和测试,我知道没有意义
  • const marco = { sayHi: () => 'something', name: 'marco' };

标签: javascript iife


【解决方案1】:

我在创建异步闭包时经常这样做,这样我就可以在非异步函数体内使用 await。它看起来像这样:

(async (arg1,arg2) => {
  console.log(arg1,arg2); // logs a,b
})('a','b');

这样我就不用创建const 然后调用它了:

const outerFunc = () => {

   // ... some code

   const innerFunc = async () => {
      // I can use await in here
   };
   innerFunc();
}

而我这样做:

const outerFunc = () => {

   // ... some code

   (async () => {
      // I can use await in here
   })();
}

要创建闭包,请省略异步部分

((...args) => console.log(...args))('a','b');

编辑:如果您仔细查看上面的内容,您会发现它实际上缩短为

(console.log)('a','b')

【讨论】:

    【解决方案2】:

    表达式被分配给变量。箭头函数一般由两部分组成:被赋值的变量和函数体,例如:

    const foo = () => { ... }
    // ^ variable
                ^^^^ function body
    

    变量的初始化只能作为一个语句,在一个独立的行上进行; const 不能在括号内。您只需要将返回值分配给的变量(函数体函数的调用)分开:

    const years = ((age) => `your ${age}`)(10);
    //             ^^^^^^^^^^^^^^^^^^^^^^
    //             this is the function body
    //             that needs to be invoked immediately
    //                                     ^^ with the (10)
    //    ^^^^^    with the result assigned to `years`
    console.log(years);

    在一个对象中,只需将function() 替换为() =>(并注意say hi 不是对象字面量中的有效对象属性 - 要么将其括在引号中,要么使用单个单词):

    const marco = {
      name: 'marco ccc',
      sayHi: () => {
        return 'something';
      }
    };
    
    console.log(marco.sayHi());

    【讨论】:

    • 但就我而言,我想知道如何使用箭头函数转换我的立即调用函数表达式。另一个例子,这让我想知道我是否有类似的东西: const marco= { name: 'marco ccc' say hi: function () { return 'something'} } 在某种程度上我可以调用 marco.sayHi();如何将 sayHi() 设为箭头函数?
    • (age) => `your ${age}` 一个箭头函数。按“运行代码 sn-p”查看它是否正常工作。但是您评论中的 const marco= { name: 'marco ccc' say hi: function () {} } 语法无效。你的意思是const marco= { name: 'marco ccc', sayHi: function () {} }?然后使用const marco= { name: 'marco ccc', sayHi: () => {} }
    • 很抱歉,但要立即调用 (age) => your ${age} 可以类似于 ((age) => your ${age} )(10);如果是,为什么不使用 const?
    • 如果你想使用调用的结果,无论你是使用箭头函数还是function,你都需要将它分配给一个变量(或者用它做其他事情)。例如const years = (function(age) {return `your ${age}`;})(10); 等价于const years = ((age) => `your ${age}`)(10);
    • 那么 IIFE 的意义何在?我是否选择:console.log(((age) => 你的年龄是 ${age}) (10));或 const years = ((age) => your ${age})(10);
    【解决方案3】:

    所以基本上我想转换这两个函数(旧版本):

    (function(age) {return `your ${age}`;
    })(10);
    

    const marco= { name: 'marco ccc',
      say hi: function () {
      return 'something';
      }
    }
    
    console.log(marco.sayHi());
    

    分别转换为:

    ((age) => your age is ${age})(10);
    

    const marco= { name: 'marco ccc', sayHi: () => {} }
    

    但除此之外,我还试图了解 IIFE 的好处,例如:

    const years = ((age) => your ${age})(10); 
    

    比类似的版本更短:

    const years = (age) => your ${age}; 
    const whatever = years(10); 
    console.log(whatever);
    

    【讨论】:

    • iife 有两个好处,如果您不使用它在非异步函数中创建异步闭包,那么只有一个 - 创建闭包。老实说,在现代 JavaScript 中使用 iife 创建闭包的好处很大程度上(不是完全,但很大程度上)被 let 减轻了,尽管您可能会看到 iife 出于文体原因,除非您确定,否则不要创建 iife您必须有一个。如果您不确定是否需要,则不需要。
    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2022-12-06
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多