使用自调用函数时,为什么我不能传递引用?

问题描述 投票:0回答:1

我最近一直在使用IIFE模式用于某些模块,并遇到了一个我似乎无法找到答案的问题。在我的项目中,我需要传递几个全局变量以供使用。其中一个是全局googletag变量,它以默认状态加载,然后在外部代码加载后更改。

但是,它似乎没有更新,因为模式似乎不创建引用而是副本。我已将问题简化为以下内容。

window.globalLevel = 'First';

var Module = (function(_g){
  function _stuff(){
    return _g;
  }
  return {
      get stuff(){
        return _stuff();
    }
  }
})(window.globalLevel);

// Initial state.
console.log("In Module:", Module.stuff);   // "First"
console.log("In Top:", window.globalLevel) // "First"

// After change.
console.log("--- Changing value ---")
window.globalLevel = 'Second'
console.log("In Module:", Module.stuff);    // "First"
console.log("In Top:", window.globalLevel)  // "Second"

我可以做些什么来解决这个问题吗?我应该做出什么样的改编或考虑?我应该直接在模块中直接引用window.globalReference吗?似乎很乱,但似乎确实有效。

JS Fiddle

javascript iife
1个回答
3
投票

你的_stuff目前正在返回最初通过的论点,即_g。因此,当您使用window.globalLevel = 'Second'更改全局变量时,参数不会更改,因此原始参数将被回显。您可以通过返回window.globalLevel来修复它:

window.globalLevel = 'First';

var Module = (function(){
  function _stuff(){
    return window.globalLevel;
  }
  return {
      get stuff(){
        return _stuff();
    }
  }
})(window.globalLevel);

// Initial state.
console.log("In Module:", Module.stuff);   // "First"
console.log("In Top:", window.globalLevel) // "First"

// After change.
console.log("--- Changing value ---")
window.globalLevel = 'Second'
console.log("In Module:", Module.stuff);    // "First"
console.log("In Top:", window.globalLevel)  // "Second"

如果window.globalLevel是一个对象而不是一个原语,那么全局变量和参数都会引用内存中相同的底层对象,在这种情况下你的_g会起作用:

window.globalLevel = { value: 'First' };

var Module = (function(_g){
  function _stuff(){
    return _g.value;
  }
  return {
      get stuff(){
        return _stuff();
    }
  }
})(window.globalLevel);

// Initial state.
console.log("In Module:", Module.stuff);   // "First"
console.log("In Top:", window.globalLevel.value) // "First"

// After change.
console.log("--- Changing value ---")
window.globalLevel.value = 'Second'
console.log("In Module:", Module.stuff);    // "First"
console.log("In Top:", window.globalLevel.value)  // "Second"
© www.soinside.com 2019 - 2024. All rights reserved.