Неясное поведение содержимого .text

#javascript #html #dom-events

Вопрос:

Я немного попрактиковался в изменении содержимого lt;pgt; элемента с помощью .textContent и сначала присвоил весь элемент переменной let

 let player1Score_El = document.getElementById ("score--0").textContent = 0;  

Проблема возникает позже, когда мне нужно изменить содержимое внутри функции, используя другую переменную, которая содержит числовое значение при нажатии кнопки с addEventListener :

 player1Score_El.textContent = score;  

затем в консоли я получаю сообщение об ошибке:

script.js:23 Неперехваченная ошибка типа: Не удается создать свойство «textContent» под номером «0» в HTMLButtonElement.holdFunc (script.js:23)

Я решил проблему, удалив .textContent = 0; из player1Score_El объявления переменной, а затем снова переназначив содержимое переменной в глобальной области со значением 0.

Хорошо, хорошо. Я вставлю код с проблемой и кодом после того, как я ее исправлю.

Вот код с проблемой:

 'use strict'; //setting the needed variables; let score = 0; let currentScore = 0; let currentScore_0El = document.getElementById ("current--0"); let player1Score_El = document.getElementById ("score--0").textContent = 0; let diceImg = document.querySelector (".dice");   //Setting roll dice button functionl; const rollDiceFunc = function () { const diceRoll = Math.trunc(Math.random() * 6)   1; currentScore  = diceRoll; currentScore_0El.textContent = currentScore; diceImg.src = `dice-${diceRoll}.png`; } document.querySelector (".btn--roll").addEventListener("click",rollDiceFunc);  // Implementing Hold button function; const holdFunc = function () {    score = score   currentScore;  player1Score_El.textContent = score;  // console.log(player1Score_El);    currentScore = 0;  currentScore_0El.textContent = currentScore; } document.querySelector (".btn--hold").addEventListener ("click", holdFunc);  

а вот код после устранения проблемы:

 'use strict'; //setting the needed variables; let score = 0; let currentScore = 0; let currentScore_0El = document.getElementById ("current--0"); let player1Score_El = document.getElementById ("score--0"); let diceImg = document.querySelector (".dice");   player1Score_El.textContent = 0;  //Setting roll dice button functionl; const rollDiceFunc = function () { const diceRoll = Math.trunc(Math.random() * 6)   1; currentScore  = diceRoll; currentScore_0El.textContent = currentScore; diceImg.src = `dice-${diceRoll}.png`; } document.querySelector (".btn--roll").addEventListener("click",rollDiceFunc);  // Implementing Hold button function; const holdFunc = function () {    score = score   currentScore;  player1Score_El.textContent = score;  // console.log(player1Score_El);    currentScore = 0;  currentScore_0El.textContent = currentScore; } document.querySelector (".btn--hold").addEventListener ("click", holdFunc);  

Что мне нужно, чтобы понять, почему в объявлении переменной это не работает, и когда я переназначаю значение player1Score_El переменной в другой строке, это сработало?

Ответ №1:

= оценивает значение, присвоенное ему. То есть:

 leftHandExpression1 = leftHandExpression2 = someExpression // equivalent to leftHandExpression1 = (leftHandExpression2 = someExpression) // equivalent to leftHandExpression2 = someExpression; leftHandExpression1 = someExpression; // assuming no side-effects  

В своем коде вы присваиваете 0 текстовому содержимому, так что это то, что назначается player1Score_El . Разделение его так, чтобы не было цепочек = s, устраняет проблему, потому что тогда player1Score_El это фактический элемент, а не 0.

Я бы рекомендовал никогда не связывать = буквы s в одном операторе — это сбивает с толку при чтении и очень часто является опечаткой или ошибкой.

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

1. Не могли бы вы подтвердить мое понимание на основе вашего комментария? Я понял, что при объявлении переменной она будет затем рассматривать каждое = как новое присвоенное значение — на простом английском языке: пусть varName = будет равно значению1, которое равно = значению 2, и примет значение 2 в качестве окончательного объявления, которое в моем случае равно 0. и значение 0 приведет к тому, что элемент вообще исчезнет. да, это имеет смысл, если так. это правильно?

2. Я не уверен, что вы имеете в виду под значениями 1 и 2. Назначения могут оцениваться как выражения и = оцениваться справа налево. Так a = b = c делает первый b = c . Это выражение оценивается c как . Затем это происходит a = c .