#javascript #variables #callback
Вопрос:
Это мой код.
var scoreResults = document.querySelectorAll(".flex-blackjack-row-1 h3");
var scores = document.querySelector(".flex-blackjack-row-1 span");
const config = {childList: true};
const busted = function (mutationList, observer){
var bustedMessage = document.createElement('h2');
bustedMessage.textContent = 'BUSTED!';
scoreResults[0].before(bustedMessage);
hitButton.setAttribute('disabled', 'true');
}
const observer = new MutationObserver(busted);
observer.observe(scores, config);
Я определил переменную bustedMessage в функции обратного вызова, и я хочу использовать ее вне этой функции обратного вызова. Тем не менее, после успешного вызова функции busted (это означает, что после инициализации переменной bustedMessage ) эта переменная не может быть использована вне функции обратного вызова.
Но когда я вынимаю этот блок кода,
var bustedMessage = document.createElement('h2');
bustedMessage.textContent = 'BUSTED!';
для внешней стороны от «сломанной» функции обратного вызова я могу использовать переменную bustedMessage и в других функциях. Пожалуйста, объясните, почему это происходит? Я не могу этого понять, потому что bustedMessage — это переменная типа var, которую следует использовать в любом месте.
Комментарии:
1. Вы пытались вернуть bustedMessage в конце функции?
2. Вы можете узнать это здесь
3. Я просто понимаю, что это функция обратного вызова, поэтому возврат переменной не сработает. Отвечая на ваш вопрос о том, почему bustedMessage не работает снаружи, это связано с областью видимости переменной. Ваш bustedMessage является локальной переменной области видимости, поэтому его нельзя использовать вне этой функции, подробнее здесь
4. Если вы хотите использовать переменную вне функции, вы можете автоматически использовать глобальную переменную, объяснение находится в ссылке, которую я предоставляю в предыдущем комментарии
5. @DeanTristaNato Спасибо. На самом деле я знаю, как автоматически создавать глобальную переменную. Я хотел знать, почему var не работает вне функции. Перейдя по ссылке, которую вы предоставили, теперь я знаю, что есть нечто, называемое областью действия функции . Даже если то, что вы сказали, неверно (это не локальная область, а область действия функции), вы подталкиваете меня к правильному пути. Поэтому я собираюсь проголосовать за ваш комментарий как полезный. Но подумайте о замене локальной области видимости на область функции
Ответ №1:
bustedMessage
Сначала определите снаружи
var bustedMessage;
const busted = function (mutationList, observer){
bustedMessage = document.createElement('h2');
bustedMessage.textContent = 'BUSTED!';
scoreResults[0].before(bustedMessage);
hitButton.setAttribute('disabled', 'true');
}
теперь вы можете свободно использовать bustedMessage в любом месте этого скрипта, конечно, он не определен, пока вы не вызовете busted
его в первый раз.
Комментарии:
1. Я могу понять, что этот блок кода работает нормально. Но я хочу понять, почему мой код не работает. Если вы можете оказать какую-либо помощь…