gpt4 book ai didi

javascript - 如何在没有闭包的情况下对共享状态进行编程?

转载 作者:行者123 更新时间:2023-12-02 16:57:36 24 4
gpt4 key购买 nike

var state = 0;
var interval = setInterval(function() {
// Do something depending on state
}, 1000)

由于一切都可以在没有闭包的情况下完成,这更像是一种智力练习,因为我不知道如何在没有闭包的情况下进行这样的编程。我是否通过引用将状态传递到匿名函数中? (JavaScript 不支持通过引用传递)

最佳答案

这是一个双赢的答案,因为当你认真思考它时,绝对没有任何范围不会创建一个闭包;这是一个是否使用闭包以及如何使用闭包的问题。

闭包只是一个内部作用域,它维护对外部作用域的引用。

这样说:

/* global */
window.incr_id = 0;
window.tick = 0;

function nextTick () { window.tick += 1; }

window.incr_id = window.setInterval(nextTick, 1000);

这对你来说算是结束吗?

从技术上讲,全局作用域相当于在其他语言中在 Main () 内部运行,因此 nextTick 函数保存对外部作用域值的引用(window),导致向上遍历值表链,从而“关闭”。

你可以尝试类似的事情

function nextTick () { nextTick.value += 1; }
nextTick.value = 0;

...但是这算不算,因为自引用来自大括号之外,因此属于更高的范围?

function nextTick () { arguments.callee.value += 1; }
nextTick.value = 0;

当然,这会阻止您在严格模式下使用此解决方案(如果您希望安全,则应该使用该解决方案)。

当然,您可以创建一个闭包,它不是所讨论的函数,而是创建 monad,这样您就可以通过组合函数增量传递值,而不是依赖于关闭引用...

当然,这里的问题是 setInterval 需要一个函数。
因此,无论您返回到 setInterval 的哪个函数,该最终函数都必须使用闭包引用,无论您的所有应用函数之前是否都使用了闭包引用。

如果您引用的函数未在当前函数作用域内定义,或者我们只是在讨论标量,那么函数引用是否算作闭包引用?

故事的寓意:

window.value = 1;
window.obj.value = 1;

func.value = 0;
function func () { func.value = 1; }

function func () { arguments.callee.value = 1; }

如果您愿意承认“window”可以被引用为不是闭包(提示,它不能),则前两个是有效的。

如果您愿意接受以非严格模式运行对您的客户、受众以及您的整体健康和福祉不利这一事实,那么最后一个可能是有效的。

关于javascript - 如何在没有闭包的情况下对共享状态进行编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050686/

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