gpt4 book ai didi

Javascript 闭包在别处定义

转载 作者:行者123 更新时间:2023-12-03 07:42:35 25 4
gpt4 key购买 nike

这是闭包的一个简单用法:

function Thing() {
var _x;
return {
setX: function(val) { _x = val; },
getX: function() { return _x }
};
}

var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);
a.getX(); //returns 12

我想要做的是能够在 Thing 的定义之外定义 setXgetX 的实现。

我尝试过这样的事情:

function setXimpl(val) {
_x = val;
}

function getXimpl() {
return _x;
}

function Thing() {
var _x;
return {
setX: setXimpl,
getX: getXimpl
};
}

var a = Thing();
var b = Thing();
a.setX(12);
b.setX(23);
a.getX(); //returns 23 not 12!

很明显,setXimplgetXimpl 正在设置/读取一些全局范围的_x,而不是在闭包内部。

我尝试了很多其他东西(主要是语法更改),但我就是无法让外部函数成为 Thing 闭包的一部分。有什么办法可以实现我想要的吗?

最佳答案

对你的问题的简短回答是否定的。

闭包的工作原理是访问函数范围内的变量,而这些变量在全局范围内是不可访问的。仅当执行获取/设置的函数是已返回的函数(创建闭包)内的嵌套函数时,才会发生这种情况。这意味着每次调用 Thing 时都必须创建 setX 和 getX 的新函数,如您的 Thing 代码中一样。

这并不意味着从 Thing 返回的函数无法通过使用(例如)IIFE 调用更接近全局作用域的静态函数定义事物:

var Thing = function(){

function a(...) {...}; // create once
function b(...) {...}; // create once
return function () { // the Thing function (create once)
var _x;
return {
setX: function(val) { _x = val; },
getX: function() { return _x }
};
};
}();

有效地为匿名 getter 和 setter 函数提供对静态定义的封装函数助手的访问权限。

关于Javascript 闭包在别处定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35348240/

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