打字稿/ JavaScript forEach

问题描述 投票:5回答:3

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

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

在javascript中它看起来像:

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

我从来没有见过这样的功能。谁能解释一下这是如何工作的?具体来说,fn => fn()实际执行的是什么。参考下面的代码,它是执行fns.push还是for循环?如果它是For循环,则没有参考,所以它是如何知道的?

以下是完整代码:

打字稿:

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(); });
javascript typescript1.8
3个回答
3
投票

看看这个例子:

var method = a => a+1;

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

打字稿会将其转化为:

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

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

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

fns.forEach(fn=>fn());意味着执行fns数组中的每个方法。


3
投票

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

fn是输入参数,=>将其定义为函数,fn()是返回值。

另一个例子是

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

是相同的

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

2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.