把變量在全局範圍內,所以你將有機會獲得它以後在任何語言中的反模式。我很驚訝所有來自JavaScript程序員的4個答案都會建議做這樣的事情。
比方說,你需要mapFun.map傳遞給someLib.callBack,你打發時間的地圖,你知道的價值因此,你可以使用閉包:
var a = 22;
someLib.callBack = function(doc){
mapFun.map(doc,a);
};
它會看起來好像someLib會傳遞「a」,但它只會傳遞「doc」。如果稍後必須更改「a」的值,則取決於範圍。如果a被傳遞,那麼重新分配它不會改變它,所以你需要傳遞一個可以被突變的對象。
var someLib = {
callBack : function(fn){
setTimeout(function(){
fn("hello");
},100);
}
};
var mapFun = {
map : function(doc,a){
console.log("doc passed when called:",doc);
console.log("variable a is:",a);
}
};
(function(){
var a = 22;
someLib.callBack(function(doc){
mapFun.map(doc,a);
});
a=44;//this is fine, same scope
a=22;
someLib.callBack(function(doc){
mapFun.map(doc,a);
});
(function(a){
a = "not changed";
}(a));//doesn't change a because you assign it in a different scope
var obj={};
obj.a=22;
someLib.callBack(function(doc){
mapFun.map(doc,obj.a);
});
(function(obj){
obj.a = "Hello World";
}(obj));//changed a because you mutated the object
//diffeerent scope doesn't matter here.
}());
如果關閉不是一個選項,你可以讓我的地圖記住一個由Trendy建議的值。
來源
2013-11-22 03:15:45
HMR
你是什麼意思「不同的環境?」它的寫法是''a''是全球性的,並且應該在以後提供。 – Jeff
我的意思是,對象'mapFun()'被傳入一個超出此範圍的函數。完全分開。它無法訪問'a' –
這應該已經可以工作,因爲'a'可以在與mapFun相同的範圍內使用 –