2011-04-29 106 views
2

我在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的值从改为改为true

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

我有内部MyCar.check()功能的Firebug的控制台输出,我想到的是,当鼠标点击CHECK_BUTTON,控制台输出将是真正,但我总是得到,为什么?我用hasCar来检查是CHECK_BUTTON被点击过一次还是不行,但是如果它总是持有的值,我无法知道它。如何摆脱这一点?

+1

我无法理解你的流程,你可以把一些html代码....? – Nirmal 2011-04-29 10:51:41

+0

CHECK_BUTTON是页面上的按钮,没有别的....我的问题是关于javascript ...我只是不明白为什么'hasCar'仍然是错误的,我点击了CHECK_BUTTON,如你所见,它应该改变为真“。 – Mellon 2011-04-29 10:53:03

+0

你打电话check_button onclick什么函数?确切地说, – Nirmal 2011-04-29 10:55:25

回答

5

原始值通过值通过值而不是通过参考

因此分配truehasCar点击事件处理程序内(在MyCar.check)不会改变在testFunc定义的hasCar值。

你可以使用一个对象,而不是:

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时都会添加一个新的点击处理程序。我不认为这是需要的。
  • 你的应用程序的结构很混乱(至少对我来说))。
+0

。我正在写同样的东西:) – maxedison 2011-04-29 10:58:20

+0

很好的接收...有人已经删除了他的答案,只要你发布这个... – Nirmal 2011-04-29 11:06:59

+0

谢谢,现在我得到它很好地工作,我学到了! :) – Mellon 2011-04-29 11:12:29

相关问题