我不明白这个功能

时间:2017-01-03 08:10:11

标签: javascript

我不懂toToFn()的函数, 在我的例子中,没有具有该名称的函数,

我不明白我的例子

示例:



var fromTo = function fromTo(i,limit){
        return function(){
            var next = i;
            if(i<limit){
                i += 1;
                return next;
            }
            return undefined;
        }
    }
var collect = function collect(fromToFn,array){
        return function (){
            var value = fromToFn();
            if (value !== undefined){
                array.push(value);
            }
            return value;
        }
    }
    var array = [];
    var col = collect(fromTo(0,2),array);
    
    col(); //returns 0
    col(); //returns 1
    col(); //returns undefined
    console.log(array); //returns [0,1]
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:1)

  

我不理解fromToFn()函数,在我的例子中没有该名称的函数

这是真的,但没关系。函数是JavaScript中的第一类对象,对它们的引用可以在变量,属性和参数中传递。

fromToFncollect函数中参数的名称:

var collect = function collect(fromToFn,array){
// ----------------------------^

因此,如果我们将函数传递给collect,我们可以通过该参数在collect内使用它。

代码 将函数传递到collect,此处:

var col = collect(fromTo(0,2),array);

...因为fromTo(0, 2) 返回一个函数,然后传递给collect。要非常清楚,因为有一些事情正在进行,传递到collect的函数是不是 fromTo,它是函数fromTo返回的。该行可以写成:

var functionToPassToCollect = fromTo(0,2);
var col = collect(functionToPassToCollect,array);

这是一个更简单的示例,演示如何使用参数调用传入的函数:

function example(f) {
    f();
}
function callMe() {
    console.log("callMe was called");
}

example(callMe);

答案 1 :(得分:0)

当你这样做时

var col = collect(fromTo(0,2),array);

您正在调用collect函数,并且您传递的第一个参数是fromTo(0,2)

fromTo函数在被调用时返回一个函数。因此,在fromToFn的调用中,collect是一个函数,也可以调用:

var value = fromToFn();

fromTocollect处理函数,它们被称为"higher-order" functions。这在JavaScript中是可行的,因为在JavaScript函数中是第一类值,它们可以像其他类型的值一样分配给变量(参见First-Class functions)。

在这种特定情况下,fromTo返回的函数的一点是它可以使用fromTo范围的变量,它被称为closure

答案 2 :(得分:0)

fromToFn是作为参数发送到'collect'函数的函数:

function collect(fromToFn,array);

并发送fromTo函数:

collect(fromTo(0,2),array)