在JavaScript中关闭并运行函数一次
以下(问题13)将采用在JavaScript中关闭并运行函数一次,javascript,closures,Javascript,Closures,以下(问题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_onc
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(这个,参数)代码>而不是简单地f(参数)因为这是JavaScript的特性之一。后者将向函数发送一个数组,而不是参数列表。但是我不明白这个
指的是什么。它是指第二行的匿名函数还是指一次?如果赋值func=null
意味着停止第二次调用,因为闭包将导致一个已为null的func
,为什么第一次调用它时它会工作
我使用了太多的问题来帮助您识别我缺少的内容,而不是期望您键入一个长的答案来独立解决每个子问题。记住,您不会再次调用
一次,因此当您看到返回函数中使用的func
时,它不再是一个指针指向传递到一次的任何对象
,因为返回函数修改了名为func
的变量在一次
提供的闭包内引用的值(因为返回函数以前已被调用),方法是说func=null
。第一次调用后,当您请求func
的值时,返回函数中返回的值已从传递到一次的原始值更改为null
编辑
读了我刚才写的东西后,虽然对我来说很有意义,但如果它对你没有帮助,我也不能责怪你
编辑#2
问题的第二部分-此
指的是什么。这完全取决于如何调用返回的函数一次。请参见*问题
*双关语记住,您不会再次调用一次
,因此当您看到返回函数中使用的func
时,它不再是一个指针指向传递到一次的任何对象,因为返回函数修改了值(因为之前已经调用了返回的函数)由once
提供的闭包内名为func
的变量引用,表示func=null
。在第一次调用后,当您请求func
的值时,返回函数内返回的值已从传递到once
的原始值更改为null代码>
编辑
读了我刚才写的东西后,虽然对我来说很有意义,但如果它对你没有帮助,我也不能责怪你
编辑#2
问题的第二部分-此
指的是什么。这完全取决于如何调用返回的函数一次
。请参见*问题
*“为什么写入func=null会阻止我们再次调用函数?”
- 当第一次运行add_once时,将执行以下步骤
var f=func;
step1-变量f现在引用了作为参数传入的add函数。func仍然引用了add函数,因此func和f现在都指向同一个add函数
func=null;
step2-现在func指向null,不再引用add函数。但是变量f仍然引用add函数
返回f.apply(这个,参数)
step3-由于f仍然引用add函数,我们可以将arguments数组传递给该函数并立即调用它。apply立即使用给定的参数调用add函数。然后我们返回结果。“this”绑定到f引用的任何函数,在本例中是add函数。记住的一个好技巧是“this”i它将绑定到调用函数的调用站点(又名)上“.”左边的任何内容。不过,在这种情况下并不重要。您也可以将null放在它的位置,这样就可以正常工作了
- 当第二次运行add_one时,这些是所采取的新步骤
var f=func;
step1-我们现在将f指向func引用的任何值。func仍然引用null,因为我们在第一次运行函数时将func指向null。现在f和func都指向null
func=null;
step2-我们再次将func变量/参数指向null。func已经指向null,所以现在func肯定指向null
返回f.apply(这是,参数);
step3-这里f仍然指向null。显然不能调用null,因为null不是函数。这里是抛出错误的地方
希望这有帮助。我喜欢记住的一点是,变量不存储任何内容,它引用一个值。我喜欢将变量视为指向一个值。可以有许多变量指向同一个值。重新分配变量只会将该变量指向一个新值。“为什么写入func=null会阻止我们再次调用该函数?”
- 何时添加一次