Я определил прототип функции массива, но при его вызове он выдает мне ошибку

#javascript #arrays #function

#javascript #массивы #функция

Вопрос:

Я определил прототип функции Array, но он выдает мне ошибку, когда я его вызываю.

 Array.prototype.bublleSort = function() {
  console.log(this)
}

[1, 23, 4].bublleSort()  

Консоль показывает «Неперехваченный TypeError: не удается прочитать свойство ‘bublleSort’ из undefined». Это где-то неправильно?

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

1. Добавьте точку с запятой после определения функции.

2. Отсутствует точка с запятой (;) после функции.

Ответ №1:

Вы забыли точку с запятой, поэтому интерпретатор видит ваш код как:

 Array.prototype.bublleSort = function() {
  console.log(this)
}[1, 23, 4].bublleSort()  

В нем используется оператор запятой внутри скобок, но функции не имеют такого свойства, как 4 :

 Array.prototype.bublleSort = function() {
  console.log(this)
}[4].bublleSort()
  

упрощает до

 <someFunction>[4].bublleSort()
  

Но функции не имеют 4 свойства.

Всегда ставьте точки с запятой в конце инструкций — нехорошо полагаться на автоматическую вставку точки с запятой, это слишком легко забыть и столкнуться с ошибками.

 Array.prototype.bublleSort = function() {
  console.log(this)
};
[1, 23, 4].bublleSort()  

Ответ №2:

Это потому, что компилятор видит открытие литерала массива как продолжение предыдущей инструкции, поскольку вы не поставили точку с запятой после определения функции.

Итак, компилятор видит:

 Array.prototype.bublleSort = function() {
  console.log(this)
}[1, 23, 4].bublleSort();
  

Возвращается доступ к несуществующему свойству функции undefined , следовательно, вы получаете ошибку.

Добавьте точку с запятой после функции, чтобы она обрабатывала их как два отдельных оператора. Точки с запятой важны!