以下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
我有两件事没有得到这个。
func = null
会阻止我们第二次调用该函数?在var f = func
中保存指向函数的指针(可以使用C语言;不是吗?)后,我希望将null
赋值给函数指针func
(func
只是一个函数指针;不是吗?)是无关紧要的 - 因为(指向)函数的指针已存储在f
中。我错过了什么?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
被取消,为什么它第一次被调用时会起作用?我使用太多问题让你有机会找出我所遗漏的内容,而不是希望你能单独输入解决每个子问题的长答案。
答案 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不是一个函数。这是抛出错误的地方。
希望这会有所帮助。我想记住的一点是,变量不存储任何内容,它引用了一个值。我喜欢将变量视为指向值。您可以将许多变量指向相同的值。重新分配变量只是将该变量指向一个新值。