Все,

Это код:

var Person = function (name) {

  this.name = name;

  this.printName = function(){
    console.log("My name is " + this.name);
  }

};


var p = new Person("Steve");

var funcRef = p["printName"];

p.printName();//Works

p["printName"]();//Works
funcRef();//returns incorrect value

Найдите рабочий пример здесь: http://plnkr.co/edit/57LS6oXPfqccAWf6uqQV?p=preview

У меня вопрос в чем разница между двумя последними? Я обращаюсь к объектному методу таким же образом, единственное отличие состоит в том, как он вызывается.

Почему он возвращает результат разницы?

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

Благодарность

Стив

6
Steven Yates 14 Дек 2015 в 19:06

4 ответа

Лучший ответ

Javascript связывает ключевое слово this при непосредственном вызове функции для объекта.

С test.fn() this будет test внутри fn. То же самое с test['fn'](). Но если вы сделаете var fn = test.fn; fn(), this будет глобальным корнем (window в браузере) внутри fn.

Вы можете принудительно вызвать this внутри функции следующим образом: var fn = test.fn.bind(test);

Больше информации здесь: https://developer.mozilla.org/en-US/ документы / Web / JavaScript / Справочник / Операторы / это

5
Magus 14 Дек 2015 в 16:10

Case1: «this» всегда принимает контекст объекта, относительно которого он вызван.

В p.printName () контекст равен p, поэтому «this» ссылается на объект Person, на который ссылается «p».

Случай 2: Но когда вы направляете 'funcRef' в метод p, он теряет этот контекст, а 'this' ссылается на глобальный объект.

Глобальный объект может отличаться в зависимости от среды js (например, контекст браузера или узел и т. Д.).

Вот почему вы видите разные результаты.

2
tyskr 14 Дек 2015 в 16:17

Как ведет себя эта область действия, уже объяснено в приведенных выше ответах, здесь рекомендуется использовать слова «this», используйте «this» в качестве новой переменной под названием «self», см. Код ниже, таким образом вы получаете лучший контроль и меньше ошибок из-за неправильных действий. использования этой области.

var Person = function (name) {
  var self=this;
  self.name = name;

  self.printName = function(){
    console.log("My name is " + self.name);
  }
};
2
Morbia 14 Дек 2015 в 16:32

Как говорят другие ответы, this связывается при вызове функции. Обычный способ сохранить ссылку на объект - использовать что-то вроде этого:

var Person = function (name) {

  var self = this; // Keep a reference to this object for later use
  self.name = name;

  self.printName = function(){
    console.log("My name is " + self.name);
  }

};
2
Gab 14 Дек 2015 в 16:20