Мой вопрос:
function Foo()
{
this.foo = "bar"; // <- What is "this" here?
}
Из того, что я могу сказать, что это зависит от как Foo
используется, т.е. в качестве конструктора или в качестве функции. Что может this
быть при различных обстоятельствах?
Ключевое слово this
относится к объекту, которому принадлежит функция, или к объекту window
, если функция не принадлежит ни одному объекту.
Это используется в коде ООП для обозначения класса / объекта, которому принадлежит функция Например:
function foo() {
this.value = 'Hello, world';
this.bar = function() {
alert(this.value);
}
}
var inst = new foo();
inst.bar();
Это предупреждение: Hello, world
Вы можете управлять, к какому объекту относится этот
, используя apply ()
или вызов ( )
функций. (Иногда очень и очень удобная функция)
var bar1 = new function() {
this.value = '#1';
}
var bar2 = new function() {
this.value = '#2';
}
function foo() {
alert(this.value);
}
foo.call(bar1); // Output: #1
foo.apply(bar2, []); // Output: #2
Прочтите, что Дуглас Крокфорд говорит по этому поводу, цитируя его из Обзор языка программирования JavaScript :
Функция - это объект. Он может содержать члены, как и другие объекты. Это позволяет функции содержать собственные таблицы данных. Это также позволяет объекту действовать как класс, содержащий конструктор и набор связанных методов.
Функция может быть членом объекта. Когда функция является членом объекта, она называется методом. Существует специальная переменная, называемая this, которая присваивается объекту при вызове метода объекта.
Например, в выражении foo.bar () переменная this устанавливается в объект foo как сортировка дополнительного аргумента для панели функций. Затем функциональная панель может ссылаться на это, чтобы получить доступ к интересующему объекту.
В более глубоком выражении, таком как do.re.mi.fa (), переменная this устанавливается равной объекту do.re.mi, а не объекту do. В простом вызове функции для него устанавливается глобальный объект (он же окно), что не очень полезно. Правильное поведение должно было заключаться в том, чтобы сохранить текущее значение this, особенно при вызове внутренних функций.
Также «this» может изменяться в зависимости от того, как вызывается ваша функция, читайте в apply function и ] call function .
Я бы порекомендовал вам потратить время на изучение одного из величайших умов JavaScript в его (бесплатных) презентациях, ссылки на которые приведены здесь .
В JavaScript соглашение (и это только соглашение) состоит в том, что любая функция, начинающаяся с заглавной буквы должен использоваться как конструктор. Затем можно вызвать
var foo = new Foo ()
, а this
будет ссылаться на вновь созданный объект, на который будет ссылаться foo
.
] Конечно, ничто не мешает вам вызвать Foo ()
самостоятельно, и в этом случае this
затем будет ссылаться на объект, из которого была вызвана функция. Во избежание путаницы делать это не рекомендуется.
В JavaScript все является объектами, даже функциями. Когда вы говорите this.foo
в следующем коде,
function Foo()
{
this.foo = "bar"; // <- What is "this" here?
}
foo
становится переменной-членом объекта Foo