Почему я всегда получаю значение ‘false’ в моем случае?

#javascript #jquery #dom-events #javascript-framework

#javascript #jquery #dom-события #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() функцию и изменю hasCar значение с false на true.

hasCar Определяется в шаблоне модуля TestFunc и передается в MyCar.check(hascar) .

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

Комментарии:

1. Я не смог понять ваш поток, не могли бы вы добавить какой-нибудь HTML-код ….?

2. CHECK_BUTTON — это кнопка на странице, ничего больше…. Мой вопрос касается javascript… Я просто не могу понять, почему ‘hasCar’ по-прежнему false после того, как я нажал CHECK_BUTTON, как вы видите, его следует изменить на true.’

3. какую функцию вы вызываете при onclick of check_button?

Ответ №1:

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

Таким образом, присвоение true значению hasCar внутри обработчика события click (в 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
  

Взгляните на эту ДЕМОНСТРАЦИЮ.


Дополнительные примечания:

  • Для лучшей совместимости заключайте свои самозапускающиеся функции в круглые скобки.
  • Вы добавляете новый обработчик щелчков при каждом вызове MyCar.ceck . Я не думаю, что это желательно.
  • Структура вашего приложения довольно запутанная (по крайней мере, для меня ;)).

Комментарии:

1. Точно. Я был в процессе написания того же самого 🙂