Javascript SyntaxError: идентификатор «img» уже объявлен

Я пытаюсь сделать снимок с локальной камеры ноутбука с помощью этого кода:

function takePhoto(img)
{ 
  const img = img || document.querySelector('img');

  imageCapture.takePhoto()
  .then(blob => {
    let url = window.URL.createObjectURL(blob);
    img.src = url;
    window.URL.revokeObjectURL(url); 
  })
  .catch(error);
};

takePhoto();

но получая следующую ошибку:

SyntaxError: Identifier 'img' has already been declared

Я проверил, в приведенном выше коде нет объявления img (также пытался переименовать его во что-то вроде image_local, бесполезно). Любые идеи, как это исправить, приветствуются. Спасибо.

Имя параметра img по сути является объявлением. Также обратите внимание, что вызов функции в конце опубликованного кода в любом случае не передает аргумент.

Pointy 30.05.2019 15:03
function takePhoto(img) <- первое объявление img; const img <- второе объявление img.
melpomene 30.05.2019 15:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
558
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не можете объявить константу с тем же именем, что и у существующей переменной. В этом случае img в параметрах вашей функции. Назовите одно из двух как-нибудь по-другому.

Ответ принят как подходящий

Изменять:

const img = img || document.querySelector('img');

к:

img = img || document.querySelector('img');

Объяснение:

Ваше определение функции включает параметр img

function takePhoto(img)

Это фактически объявляет переменную с именем img для использования внутри функции с любым значением, которое было передано во время вызова функции. Затем вы пытаетесь повторно объявить переменную img как константу внутри функции:

const img ...

Вы не можете этого сделать, как указано в полученном вами SyntaxError.

@T.J.Crowder Согласен. Я обновил ответ, включив в него краткое объяснение. Спасибо за толчок к адекватному ответу.

Jeff Jenkins 30.05.2019 15:07

В вопросе, который вы упомянули

"there is no any declaration of img in the code above"

... на самом деле есть два объявления (согласно сообщению об ошибке):

1)

function takePhoto(img) 

Это эффективно объявляет переменную, потому что помещает ее в область действия функции с таким именем.

2)

const img

Здесь вы пытаетесь снова объявить ту же переменную.

У вас может быть не более одного объявления одной и той же переменной. изменение

const img = img || document.querySelector('img');

к

img = img || document.querySelector('img');` 

исправит это, поскольку он больше не пытается повторно объявить переменную, теперь он просто (потенциально) меняет ее значение.

Другие вопросы по теме