ключевое слово this, не ясно - PullRequest
5 голосов
/ 25 марта 2011

Я запутался в ключевом слове ' this ' в следующих кодах, есть два слова 'this':

var Foo = function(string){
  this.name=string // 1st-this
}

Foo.prototype.get_name = function(){
  return this.name // 2nd-this
}

var myFoo = new Foo('John')

the_name=myFoo.get_name()

' the_name ' равно«Джон», метод-прототип получает имя по возвращению this.name .Но может ли кто-нибудь объяснить мне 1- это и 2- это , что они обозначают?

Ответы [ 8 ]

15 голосов
/ 25 марта 2011

В Javascript значение this зависит от способа, которым вы вызываете функцию .

. Есть 5 способов вызова функции в JS, и все они имеют эффектthis:

  1. new Foo(); <= здесь вы создаете новый объект, а <code>this будет отражать этот новый объект
  2. Foo(); <= здесьвы вызываете функцию как есть, и <code>this будет глобальным объектом (!)
  3. var obj = { foo: Foo };<br> obj.foo(); <= здесь вы вызываете функцию как метод <code>obj;this будет obj
  4. Foo.call(thisObject, arg1, arg2); <= здесь, вы можете указать значение <code>this в первом аргументе
  5. Foo.apply(thisObject, [args]); <= здесь вы можете указатьзначение <code>this в первом аргументе

В 4 и 5 разница между call и apply заключается в том, что с call вынеобходимо передать все аргументы отдельно, тогда как с apply вы можете передать массив, содержащий все аргументы.

Обратите внимание, что в моем примере 2 выше, была вызвана функция должна foo вместо Foo.Поскольку невозможно узнать из рук в руки, должна ли функция вызываться с new или нет, единодушным является то, что имя функции должно начинаться с заглавной буквы, если это конструктор (и его следует использовать с new);в противном случае он должен начинаться со строчной буквы.

2 голосов
/ 25 марта 2011

При использовании ключевого слова new this - это объект экземпляра, который вы создаете.

var foo = new Bar();

т.е. экземпляр Bar присваивается foo


Если вы этого не сделаете, this - это объект, на котором живет метод, который вы вызываете.

var baz = foo.thing();
var boz = thing();

т.е. foo в первом примере и window во втором (window является объектом по умолчанию).


Вы также можете fritz с ним, используя apply

var baz = foo.thing.apply(bar);

Здесь this (все еще внутри метода thing) равно bar)

2 голосов
/ 25 марта 2011

Ответ "это зависит", поскольку значение this зависит от контекста , в котором он вызывается.

Например, в таких вещах, как обратные вызовы, thisбольше не относится к текущему объекту, но более типично к элементу DOM, в котором произошло событие:

Итак, эта идентично выглядящая функция:

Foo.prototype.handleSomeEvent = function(e) {
    return this.name;
}

, если она используется в качестве обратного вызова событияпопытайтесь разрешить атрибут name элемента, а не имя вашего объекта.

2 голосов
/ 25 марта 2011

эта ссылка поможет вам понять: Ключевое слово this

function doSomething() {
   this.style.color = '#cc0000';
}

В JavaScript это всегда относится к «владельцу» выполняемой нами функции, или, скорее, кобъект, для которого функция является методом.Когда мы определяем нашу верную функцию doSomething () на странице, ее владельцем является страница, или, скорее, объект окна (или глобальный объект) JavaScript.Однако свойство onclick принадлежит элементу HTML, к которому оно относится.

1 голос
/ 20 октября 2011

вау все эти разные ответы, и только один из них даже использовал слово «контекст»! Вот простой ответ на ваш вопрос:

ключевое слово this является ссылкой на объект, которая указывает на объект контекста.

В вашем примере this относится к экземпляру объекта Foo.

1 голос
/ 25 марта 2011

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

Это становится сложнее при работе с обратными вызовами или при определении переменных-членов в методах-прототипах.

1 голос
/ 25 марта 2011

this относится к объекту, вызывающему функцию, который в данном случае равен myFoo.Когда вы создаете myFoo как new Foo('John'), ключевое слово this позволяет вам установить myFoo.name = 'John', поэтому при вызове myFoo.get_name() оно также позволит вам return myFoo.name, что равно John.

0 голосов
/ 25 марта 2011

Ключевое слово "this" всегда относится к владельцу функции.Так, например, если вы нажмете кнопку, которая обращается к этой функции, это относится к этой кнопке.Так что если у вас есть кнопка A, которая имеет щелчок, который вызывает эту функцию, то это A.

В этом случае это будет Джон, поскольку в обоих случаях они ссылаются на myFoo, то есть на Джона, поскольку Myfoo используется для их вызова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...