我在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()
函数,并将hasCar
的值从false更改为true。hasCar
在testFunc模块模式中定义,并传递给MyCar.check(hascar)
。我在
MyCar.check()
函数中有一个fireBug控制台输出,我希望当鼠标单击CHECK_BUTTON
时,控制台输出为true,但是我总是得到false,为什么?我使用hasCar
来检查CHECK_BUTTON
是否被单击过一次,但是如果它始终保持错误值,我将无法得知。如何摆脱这个? 最佳答案
原始值是通过值而不是通过引用传递的。
因此,在点击事件处理程序(在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
时,您都将添加一个新的单击处理程序。我不希望这样做。您的应用程序的结构非常混乱(至少对我来说是这样)。
关于javascript - 为什么我总是得到“假”值(value)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5831007/