【问题标题】:Why I always get 'false' value in my case?为什么在我的情况下我总是得到“假”值?
【发布时间】:2011-08-15 10:02:24
【问题描述】:

我在 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改为真实。

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

我在MyCar.check() 函数中有一个fireBug 控制台输出,我希望当鼠标单击CHECK_BUTTON 时,控制台输出将为true,但我总是得到false强>,为什么?我使用hasCar 来检查CHECK_BUTTON 是否被点击过一次,但如果它总是保持 false 值,我不知道。如何摆脱这个?

【问题讨论】:

  • 我看不懂你的流程,你能放一些html代码吗......?
  • CHECK_BUTTON 是页面上的一个按钮,仅此而已....我的问题是关于 javascript...我只是无法弄清楚为什么在单击 CHECK_BUTTON 后“hasCar”仍然是错误的,因为你看,应该改成true。'
  • 你在 check_button 的 onclick 上调用了什么函数?

标签: javascript jquery dom-events javascript-framework


【解决方案1】:

原始值按值传递,不按引用传递

因此,在单击事件处理程序(在MyCar.check 中)内将true 分配给hasCar 不会更改在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 时,您都会添加一个新的单击处理程序。我认为这不是我们想要的。
  • 您的应用程序的结构相当混乱(至少对我来说是这样;))。

【讨论】:

  • 没错。我正在写同样的东西:)
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多