2016-07-11 1 views
3

У меня есть prototype функция, написанная на Array класса какПочему «это» равно «окну» в моей прототипной функции?

Array.prototype.myfunc =() => 
{ 
    // ... 
} 

и внутри тела this имеет в виду window, когда я зову его на массив как

var result = [1, 69, -1, 1].myfunc(); 

Как я могу сделать это, обратитесь к массиву, на котором он вызывается?

+0

Почему вы используете lambdas BTW? Они по-прежнему не поддерживаются многими браузерами. –

+1

Связано: [Функция стрелки против объявления/выражений функции: являются ли они эквивалентными/сменными?] (Http://stackoverflow.com/q/34361379/218196) –

ответ

3

Синтаксис связи () => { } привязан к току this, который, вероятно, равен window (в зависимости от того, когда вы назначаете функцию).

1

Синтаксис толстой стрелки в ES6 является неявным связыванием с текущей областью.

Если ваша текущая область действия - Window (или глобальная область), то функция, которую вы только что установили в прототипе, привязана к этой области.

Вам по-прежнему нужен хороший ol 'function() синтаксис для поведения без привязки.

1

Просто не используйте функцию стрелки здесь, функция стрелки наследует контекст от родительской области.

Array.prototype.myfunc = function() { 
    // ... 
} 
0

Что вызывает проблему является использования функции стрелки.

В стрелок функций, то this ключевое слово может ссылаться на:

  1. окна (если доступ по всему миру, а не в строгом режиме),
  2. неопределенными (если доступ по всему миру, в строгом режиме),
  3. экземпляр (если в конструкторе),
  4. объект (если в методе или функции внутри объекта или экземпляра) или
  5. переплетены/прикладное значение.

Чтобы устранить проблему, вы должны использовать «нормальный» function() и вы можете вызвать вашу функцию, используя call(this, ...params):

  • В this вы положили объект, который вы хотите ключевое слово this в быть связанными с и
  • В ..args вы положили параметры вашей функции, если они есть.

Таким образом, с учетом вышеизложенного, ваш код может быть таким, как показано ниже:

Array.prototype.myfunc = function(...) { 
    // Your code 
} 

var array = [1, 69, -1, 1]; 
var result = myfunc.call(array, ...); 
  • Использование array в качестве первого аргумента в call(), вы связать this ключевое слово до array.
Смежные вопросы