Почему я всегда получаю «ложное» значение в моем случае? - PullRequest
2 голосов
/ 29 апреля 2011

У меня есть функция в 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).

У меня есть консольный вывод fireBug внутри функции MyCar.check(), я ожидаючто при щелчке мышью по CHECK_BUTTON вывод консоли будет true , но я всегда получаю false , почему ??Я использую hasCar, чтобы проверить, был ли нажат CHECK_BUTTON один раз или нет, но если он всегда содержит значение false , я не могу знать это.Как от этого избавиться?

1 Ответ

5 голосов
/ 29 апреля 2011

Примитивные значения передаются по значению и не по ссылке .

Таким образом, присвоение 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.Я не думаю, что это желательно.
  • Структура вашего приложения довольно запутанная (по крайней мере, для меня;)).
...