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

Mel*_*lon 2 javascript jquery javascript-events 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
           }
      }
   }

}();
Run Code Online (Sandbox Code Playgroud)

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);
         }
     }
}();
Run Code Online (Sandbox Code Playgroud)

正如您在MyCar模块模式中看到的,CHECK_BUTTON单击何时,我将调用createCar()function,并将hasCar值从false更改为true.

该hasCar定义在testFunc模块模式,并传递给MyCar.check(hascar).

我有内部Firebug的控制台输出MyCar.check()功能,我想到的是,当鼠标点击CHECK_BUTTON,控制台输出将是真实的,但我总是假的,为什么?我hasCar用来检查CHECK_BUTTON已被点击过一次与否,但如果它总是持有假值,我就不知道了.如何摆脱这个?

Fel*_*ing 5

原始值按值传递,而不是通过引用传递.

因此true,hasCar在click事件处理程序(in 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);
         }
     }
}());
Run Code Online (Sandbox Code Playgroud)

或者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
Run Code Online (Sandbox Code Playgroud)

看看这个DEMO.


附加说明:

  • 为了获得更好的兼容性,请使用括号括起自调整函数.
  • 您每次MyCar.ceck调用时都要添加一个新的单击处理程序.我不认为这是理想的.
  • 您的应用程序的结构非常混乱(至少对我来说;)).