gpt4 book ai didi

javascript - 这个 'run once' Javascript 函数是如何工作的?

转载 作者:行者123 更新时间:2023-11-28 14:54:44 25 4
gpt4 key购买 nike

我从 Functional Programming with JavaScript Using EcmaScript 6 获取了此代码书。

这就是代码的工作原理。由于内部变量 done,多次调用 doPayment() 不会执行输入箭头函数 () => { say("Payment Done") } 在第一次运行时设置为 true

但我的理解是,每次调用doPayment()时,变量done每次都会被初始化为false,所以内部箭头函数每次都会运行。

它的工作原理如何?

function say(v)
{
document.querySelector('#out').innerHTML += v + "</br>";
}

const once = fn => {

let done = false;

return function() {
return done ? undefined : ((done = true), fn.apply(this, arguments));
}
}

var doPayment = once(() => {
say("Payment Done");
});

doPayment();
doPayment();
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<span id="out" style="font-family: roboto"></span>
</body>
</html>

---------更新--------------------

看到像这样的中等复杂的问题因为与其他问题重复而被要求关闭,真是令人沮丧。

在所有答案中,@Sylvester 的答案被选为正确答案。我也给出了我自己的解释作为答案。

最佳答案

当您调用once时,局部变量done将初始化为false并返回函数。该函数是绑定(bind)到 doPayment 的函数,因此每次调用都会检查并可能改变在创建该函数的 once 调用中创建的 done

如果你要做两个:

const fnPrint = console.log.bind(null, "test");
const fn1 = once(fnPrint);
const fn2 = once(fnPrint);

此处 fn1fn2 来自 once 的两次不同调用,因此它们将具有不同 done 绑定(bind)在它们的闭包中。

fn1() ; prints "test"
fn1() ; does nothing
fn2() ; prints "test"
fn2() ; does nothing

关于javascript - 这个 'run once' Javascript 函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com