关闭JavaScript并运行一次函数

时间:2016-06-11 23:13:04

标签: javascript closures

以下function once(问题13)将func并返回一个允许func仅被调用一次的函数。

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

function once(func) {
    return function () {
        var f = func;
        func = null;
        return f.apply(this, arguments);
    };
}

add_once = once(add);
add_once(3, 4)   // 7
add_once(3, 4)   // throws

我有两件事没有得到这个。

  1. 为什么写func = null会阻止我们第二次调用该函数?在var f = func中保存指向函数的指针(可以使用C语言;不是吗?)后,我希望将null赋值给函数指针funcfunc只是一个函数指针;不是吗?)是无关紧要的 - 因为(指向)函数的指针已存储在f中。我错过了什么?
  2. 我认为f.apply(this, arguments);f(arguments);而不是this,因为它是JavaScript的特质之一。后者会向函数发送一个数组,而不是参数列表。但我不明白once指的是什么。它是指第二行的匿名函数还是func = null?如果分配func意味着停止第二次调用,因为闭包将导致#user.rb has_many :topics has_many :lessons, through: :topic #topic.rb has_many :lessons #lesson.rb belongs_to :topic belongs_to :user 被取消,为什么它第一次被调用时会起作用?
  3. 我使用太多问题让你有机会找出我所遗漏的内容,而不是希望你能单独输入解决每个子问题的长答案。

2 个答案:

答案 0 :(得分:1)

请记住,您不能再次呼叫once,以便当您在返回的函数中看到func使用时,它不再是指针传递到once的任何内容,因为返回的函数已修改func提供的闭包内名为once的变量引用的值(因为之前已调用返回的函数),说func = null。在第一次调用之后,当您要求func的值时,返回函数内返回的值已从传递到once的原始值更改为null

修改

在阅读了我刚写的内容之后,虽然这对我有意义,但如果它对你没有帮助,我就不能责怪你:S

编辑#2

问题的第二部分 - this指的是什么。它完全取决于您如何调用once返回的函数。请参阅 this * 问题

*双关语

答案 1 :(得分:1)

"为什么写func = null会阻止我们第二次调用该函数?"

  • 当第一次运行add_once时,这些是采取的步骤......

    var f = func; step1 - 变量f现在引用作为参数传入的add函数。 func仍然引用了add函数,所以现在func和f都指向相同的add函数。

    func = null; step2 - 现在func指向null并且不再引用add函数。但可修复的f仍然引用了添加功能。

    return f.apply(this,arguments); step3 - 因为f仍然引用add函数,我们可以将该函数传递给arguments数组并立即调用它。 apply立即使用给定的参数调用add函数。然后我们返回结果。 '这'绑定到f引用的任何内容,在这种情况下它是add函数。要记住的一个好方法就是“这个'将被绑定到'左边的任何内容。'在呼叫站点,也就是调用函数的地方。但在这种情况下并不重要。您也可以将null放在其位置,它可以正常工作。

  • 当第二次运行add_once时,这些是采取的新步骤....

    var f = func; step1 - 我们现在将f指向func引用的任何值。 func仍然引用null,因为我们在第一次运行函数时将func指向null。现在f和func都指向null。

    func = null; step2 - 我们再次将func变量/参数指向null。 func已经指向null,所以现在func肯定指向null。

    return f.apply(this,arguments); step3 - 这里f仍然指向null。你显然不能调用null,因为null不是一个函数。这是抛出错误的地方。

希望这会有所帮助。我想记住的一点是,变量不存储任何内容,它引用了一个值。我喜欢将变量视为指向值。您可以将许多变量指向相同的值。重新分配变量只是将该变量指向一个新值。