从同一页面上 "global" 级别的命名空间访问 JavaScript 变量
Accessing a JavaScript variable from a namespace at a "global" level on the same page
我正在尝试从同一页面上的“全局”级别的命名空间访问变量,但到目前为止一直无法这样做。这是代码:
window.addEventListener('resize',
() => {
alert('entityId in addEventListener alert: ' + Best.Namespace.Ever.entityId);
// prints "entityId in addEventListener alert: undefined"
});
var Best = Best || {};
Best.Namespace = Best.Namespace || {};
Best.Namespace.Ever= Best.Namespace.Ever || (function () {
var entityId;
function doSomethingAmazing(something) {
entityId = alterEntityIdBasedUponSomething(something);
alert('entityId in doSomethingAmazing: ' + entityId);
// prints "entityId in doSomethingAmazingalert: 14"
// a lot of other stuff
}
return {
doSomethingAmazing: doSomethingAmazing,
entityId: entityId
// a lot of other stuff
};
}());
这里的问题是我无法从 addEventListener 方法的警报中访问 entityId。那时它是未定义的。但是,我可以在设置好后立即在警报中访问它。 (有关打印内容,请参阅上面代码中的注释。)
我觉得这应该是可能的,我只是不知道访问 entityId 的正确方法。如果有人有任何想法,我将不胜感激。
谢谢!!
你的问题是原语在 JS 中作为值而不是引用传递。
这是你想要的:
window.addEventListener('resize',
() => {
alert('entityId in addEventListener alert: ' + Best.Namespace.Ever.wrapper.entityId);
// prints "entityId in addEventListener alert: 14"
// after 1 second
// prints "entityId in addEventListener alert: 18"
});
var Best = Best || {};
Best.Namespace = Best.Namespace || {};
Best.Namespace.Ever= Best.Namespace.Ever || (function () {
const wrapper = {entityId : 14} ;
function doSomethingAmazing(something) {
//entityId = alterEntityIdBasedUponSomething(something);
wrapper.entityId = 18;
alert('entityId in doSomethingAmazing: ' + wrapper.entityId);
// prints "entityId in doSomethingAmazingalert: 18"
// a lot of other stuff
}
return {
doSomethingAmazing: doSomethingAmazing,
wrapper
// a lot of other stuff
};
}());
setTimeout(_=>{
Best.Namespace.Ever.doSomethingAmazing();
},1000)
事实证明,这不完全是代码问题,而是意外页面 loading/event 触发。发生的事情是 doSomethingAmazing
函数在页面加载时被调用,并且将 entityId
设置为 14 就好了。但是,在那之后另一个事件(或其他事件)再次重新加载整个脚本,将 entityId
重新初始化为未定义(但不调用 doSomethingAmazing)。因此,当调用调整大小事件并打印 entityId
时,它是未定义的。
我的问题是未能理解 entityId
在 JavaScript 页面加载之间基本上是无状态的基本原理;每次加载整个脚本时它都会重新初始化。
希望这对某人有所帮助!
我正在尝试从同一页面上的“全局”级别的命名空间访问变量,但到目前为止一直无法这样做。这是代码:
window.addEventListener('resize',
() => {
alert('entityId in addEventListener alert: ' + Best.Namespace.Ever.entityId);
// prints "entityId in addEventListener alert: undefined"
});
var Best = Best || {};
Best.Namespace = Best.Namespace || {};
Best.Namespace.Ever= Best.Namespace.Ever || (function () {
var entityId;
function doSomethingAmazing(something) {
entityId = alterEntityIdBasedUponSomething(something);
alert('entityId in doSomethingAmazing: ' + entityId);
// prints "entityId in doSomethingAmazingalert: 14"
// a lot of other stuff
}
return {
doSomethingAmazing: doSomethingAmazing,
entityId: entityId
// a lot of other stuff
};
}());
这里的问题是我无法从 addEventListener 方法的警报中访问 entityId。那时它是未定义的。但是,我可以在设置好后立即在警报中访问它。 (有关打印内容,请参阅上面代码中的注释。)
我觉得这应该是可能的,我只是不知道访问 entityId 的正确方法。如果有人有任何想法,我将不胜感激。
谢谢!!
你的问题是原语在 JS 中作为值而不是引用传递。
这是你想要的:
window.addEventListener('resize',
() => {
alert('entityId in addEventListener alert: ' + Best.Namespace.Ever.wrapper.entityId);
// prints "entityId in addEventListener alert: 14"
// after 1 second
// prints "entityId in addEventListener alert: 18"
});
var Best = Best || {};
Best.Namespace = Best.Namespace || {};
Best.Namespace.Ever= Best.Namespace.Ever || (function () {
const wrapper = {entityId : 14} ;
function doSomethingAmazing(something) {
//entityId = alterEntityIdBasedUponSomething(something);
wrapper.entityId = 18;
alert('entityId in doSomethingAmazing: ' + wrapper.entityId);
// prints "entityId in doSomethingAmazingalert: 18"
// a lot of other stuff
}
return {
doSomethingAmazing: doSomethingAmazing,
wrapper
// a lot of other stuff
};
}());
setTimeout(_=>{
Best.Namespace.Ever.doSomethingAmazing();
},1000)
事实证明,这不完全是代码问题,而是意外页面 loading/event 触发。发生的事情是 doSomethingAmazing
函数在页面加载时被调用,并且将 entityId
设置为 14 就好了。但是,在那之后另一个事件(或其他事件)再次重新加载整个脚本,将 entityId
重新初始化为未定义(但不调用 doSomethingAmazing)。因此,当调用调整大小事件并打印 entityId
时,它是未定义的。
我的问题是未能理解 entityId
在 JavaScript 页面加载之间基本上是无状态的基本原理;每次加载整个脚本时它都会重新初始化。
希望这对某人有所帮助!