我在 testFun.js
中有一个功能var testFunc=function{
var hasCar=false;
return{
checkCar: function(){
for(var i=0; i<5; i++){
MyCar.check(hasCar); //defined in following MyCar.js
}
}
}
}();
MyCar.js
中的另一项功能var MyCar=function(){
var createCar=function(){
//Create a car
//var car = new Car();
}
return{
check: function(hasCar){
console.log(hasCar); //PROBLEM HERE: fierBug console output is "false" always even CHECK_BUTTON has been clicked, why?
var handler=function(){
if(!hasCar)
createCar();
hasCar=true;
}
//CHECK_BUTTON is a button on UI
CHECK_BUTTON.click(handler);
}
}
}();
正如您在 MyCar 模块模式中看到的那样,当点击CHECK_BUTTON
时,我会调用createCar()
函数,并从 false更改hasCar
值到 true 。
hasCar
在 testFunc 模块模式中定义,并传递给MyCar.check(hascar)
。
我在MyCar.check()
函数中有一个fireBug控制台输出,我希望当鼠标点击CHECK_BUTTON
时,控制台输出将是 true ,但我总是得到假,为什么?我使用hasCar
检查CHECK_BUTTON
是否已被点击过一次,但如果它始终包含 false 值,我就无法知道。如何摆脱这个?
答案 0 :(得分:5)
原始值按值按值传递,按参考值传递。
因此,在点击事件处理程序(true
)内为hasCar
分配MyCar.check
不会更改hasCar
中定义的testFunc
的值。
您可以改为使用对象:
var testFunc= (function(){
var hasCar = {val: false};
// ...
}());
var MyCar=(function(){
//...
return{
check: function(hasCar){
console.log(hasCar.val);
var handler=function(){
if(!hasCar.val)
createCar();
hasCar.val=true;
}
CHECK_BUTTON.click(handler);
}
}
}());
或者在两个函数都可以访问的范围中定义hasCar
变量。
<强>更新强>
您仍会在控制台中获得false
因为hasCar.val
仅在您点击按钮后设置为true
,而您在点击按钮时从不致电console.log
。
在这里使用循环并不能告诉你任何事情。根据您的设置,更适合测试:
var hasCar = {val: false};
MyCar.check(hasCar); // will output false
// now click the button
MyCar.check(hasCar); // will output true
看看这个DEMO。
补充说明:
MyCar.ceck
时,您都会添加一个新的点击处理程序。我不认为这是理想的。