我在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/

10-12 00:02