使用自调用函数时,为什么不能传递引用?
When using a self-invoking function, why can't I pass references?
我最近一直在对某些模块使用 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
吗?看起来很乱,但它确实有效。
您的 _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"
我最近一直在对某些模块使用 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
吗?看起来很乱,但它确实有效。
您的 _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"