Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中关闭并运行函数一次_Javascript_Closures - Fatal编程技术网

在JavaScript中关闭并运行函数一次

在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

以下(问题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(这个,参数)而不是简单地
    f(参数)
    指的是什么。它是指第二行的匿名函数还是指一次
    ?如果赋值
    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会阻止我们再次调用该函数?”

    • 何时添加一次