为什么我总是在我的案件中得到'虚假'的价值?

时间:2011-04-29 10:42:03

标签: jquery javascript-events javascript javascript-framework

我在 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 值,我就无法知道。如何摆脱这个?

1 个答案:

答案 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时,您都会添加一个新的点击处理程序。我不认为这是理想的。
  • 您的应用程序结构非常混乱(至少对我而言;))。