从同一页面上 "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 页面加载之间基本上是无状态的基本原理;每次加载整个脚本时它都会重新初始化。

希望这对某人有所帮助!