【问题标题】:Typescript/JavaScript forEach打字稿/JavaScript forEach
【发布时间】:2016-11-06 20:30:37
【问题描述】:

我正在做一个关于 Typescript 词法范围处理的教程,我遇到了一个我以前从未见过的函数的用法。在 forEach 语句中看起来像一个空函数。在打字稿中它看起来像这样:

fns.forEach(fn=>fn());

在 javascript 中它看起来像:

fns.forEach(function (fn) { return fn(); });

我从未见过这样使用的函数。有人可以解释这是如何工作的吗?具体来说, fn=>fn() 实际执行的是什么。参考下面的代码,它是执行 fns.push 还是 for 循环?如果是 For 循环就没有引用 this 那它怎么知道呢?

以下是完整代码:

TypeScript:

var fns = [];
for(var i=0;i<5;i+=1){
    fns.push(function(){
        console.log(i);
    })
}
fns.forEach(fn=>fn());

JavaScript

var fns = [];
for (var i = 0; i < 5; i += 1) {
    fns.push(function () {
        console.log(i);
    });
}
fns.forEach(function (fn) { return fn(); });

【问题讨论】:

  • 什么这么复杂?它执行数组中的每个函数。但是,由于关闭问题,您的示例将不起作用。尝试将for 循环中的var 更改为let。此外,虽然与您的问题无关,但箭头函数并不是 TypeScript 特有的——它们只是普通的旧 ES6。

标签: javascript typescript1.8


【解决方案1】:

它循环遍历一个函数数组,因为函数可以像字符串、整数等一样存储在变量中。所以你循环遍历一个函数数组并像这样执行它们:return fn();

【讨论】:

    【解决方案2】:

    fn =&gt; fn() 是一个函数定义,在 C# 中它们被称为 Lambda 表达式,它只是相同 function (fn) { return fn(); } 的语法糖。

    fn为输入参数,=&gt;定义为函数,fn()为返回值。

    另一个例子是

    var add = (a,b) => a + b;
    

    相同
    function add(a, b) { 
        return a + b;
    }
    

    【讨论】:

    • 在这种情况下它可能是语法糖,但总的来说不是,因为this 和相关问题的定义不同。
    【解决方案3】:

    看看这个例子:

    var method = a => a+1;
    

    method 是一个包含对函数的引用的 var。
    a 是输入参数。
    a+1 是方法体和返回类型。

    Typescript 会将其转换为:

    var method = function (a) { return a + 1; };
    

    查看typescript playground example,您会很快理解这个概念。

    在您的示例中, fns 是一个函数数组。

    fns.forEach(fn=&gt;fn()); 表示执行 fns 数组中的每个方法。

    【讨论】:

    • 感谢您的回复,所以我感到困惑的是它执行的实际方法是什么?例如 For 循环或 fns.push??
    • 啊,现在知道了,方法是 function(){console.log(i)};这就是我所缺少的。谢谢你的解释!!
    猜你喜欢
    • 2020-09-30
    • 2021-07-02
    • 2018-04-15
    • 2020-07-24
    • 2021-04-03
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多