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

时间:2018-09-18 06:12:41

标签: javascript iife

最近我在某些模块上使用了Slick.prototype.setupInfinite()模式,但遇到了一个我似乎找不到答案的问题。在我的项目中,我需要传递几个全局变量以供使用。其中之一是全局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" ?似乎很杂乱,但似乎确实有效。

this page

1 个答案:

答案 0 :(得分: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 object 而不是基本类型,则全局变量和参数都将引用内存中的同一基础对象,在这种情况下,您的_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"