#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. Точно. Я был в процессе написания того же самого 🙂