试图把头包裹在Dart中

时间:2018-06-28 13:15:36

标签: javascript dart closures

我目前正在学习Google Dart。我目前在试图理解从dart文档中摘录的这段代码中发生的事情感到困惑:

Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);

  // Create a function that adds 4.
  var add4 = makeAdder(4);

  assert(add2(3) == 5);
  assert(add4(3) == 7);
}

我发现很难理解的是add2(3)add(3)部分。根据我收集的数据,makeAdder(2)makeAdder(4)分别在其自身范围内将变量addBy分配给2和4。因此,将变量add2分配给addBy 2,将变量add4分配给addBy 4。但是我对此不太了解:在执行带有参数(即add2(3)add4(3))的函数时,参数不应该分配变量addBy,所以addBy是否应该分别等于变量3? Dart怎么知道将i分配给3而不是addBy?

我希望我说得通。

2 个答案:

答案 0 :(得分:3)

makeAdder接受一个参数(addBy),并返回一个也接受一个参数(i)的函数。

调用var add2 = makeAdder(2)时,此处的参数2传递给addBy,该函数返回的lambda值等效于:

num add2(num i) { 
  return 2 + i;
}

稍后调用add2(3)时,参数3传递给i

关键是要了解makeAdder返回带有参数的函数。

答案 1 :(得分:0)

makeAdder在这里返回一个函数。从makeAdder返回的函数基本上更接近。使用参数调用makeAdder后,其值将保留在addBy参数中。因此,当您执行诸如makeAdder(2)(3)之类的调用时,它将返回5。

在简单的javascript中,此功能如下-

var makeAdder = function(addBy) {
    return (param) => { 
        return addBy+param;
    }
}

内部功能只是一个简单的箭头功能。如果我们将makeAdder称为makeAdder(5)(6),它将返回11