gpt4 book ai didi

javascript - 是否可以让变量可见 "only to modules"及其扩展?

转载 作者:行者123 更新时间:2023-11-29 17:22:45 24 4
gpt4 key购买 nike

假设我有以下模块,分为多个文件,都能够扩展 skillet:

File1.js:

(function(){
var privateVar1 = 0;

var privateFunction1 = function() {
//function definiton
};

skillet.fry() = function() {
//fry it
//matchbox.light();
};

})(window.skillet = window.skillet || {});

File2.js:

(function(){
var privateVar2 = 0;

var privateFunction2 = function() {
//some private function
};

skillet.grillIt = function() {
//grill It
//matchbox.strike(); <-- Shared with File1.js
};

})(window.skillet = window.skillet || {});

是否可以让一个共享变量/对象像 matchbox 被两个模块共享而不被绑定(bind)到 window.matchboxwindow.skillet.matchbox? IE。 matchbox可见性 应该只对 File1.js 和 File2.js 有效,其他地方不能访问。我怀疑这是否可能,但有没有办法在 JavaScript 中实现这种行为?如果不是,在这方面使用的最佳做法是什么?

(这更像是在一组相关模块之间共享一个事件总线,而不在全局范围内公开该总线)

最佳答案

没有。

“私有(private)”变量在 JS 中起作用只是因为函数声明的作用域。无法与在完全不同的作用域中声明的函数共享该作用域。范围是函数的一个不可更改的属性,一旦它们被创建。

这就是为什么这类事情通常使用 _foo 样式属性完成的原因。

skillet._matchbox = { strike: function() { ... } };

下划线前缀是“内部”的约定,并作为一个提示不要乱用它。


尽管在所有情况下,这都意味着提供一种将 matchbox 移出其原始范围的方法,但您也可以在如何传递 matchbox 方面发挥创意。也许,制作一个将火柴盒传递给它的参数的 skillet.extend 方法?

(function() {
var matchbox = { strike: function() { ... } }
window.skillet = {
extend: function(fn) {
fn(matchbox);
}
};
})();

skillet.extend(function(matchbox) {
var privateVar2 = 0;
var privateFunction2 = function() {};

skillet.grillIt = function() {
//grill It
matchbox.strike();
};
}

这允许您以受控方式在其原始范围之外使用 matchbox。但它也允许任何人获得可能不应该得到的 matchbox

var stolenMatchbox;
skillet.extend(function(matchbox) {
stolenMatchbox = matchbox;
});
while (stolenMatchbox.count > 0) { stolenMatchbox.strike(); }
alert("Now you are outta matches, sucker!");

关于javascript - 是否可以让变量可见 "only to modules"及其扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11568126/

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