Мой вопрос:
function Foo()
{
this.foo = "bar"; // <- What is "this" here?
}
Из того, что я могу сказать, зависит от того, как используется Foo
, т.е. как конструктор или как функция. Что может this
быть в разных обстоятельствах?
Мой вопрос:
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
Вы можете манипулировать тем, к какому объекту this
относится с помощью функций apply()
или call()
. (Очень удобная функция время от времени)
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:
Функция - это объект. Он может содержать участников так же, как и другие объекты. Это позволяет функции содержать свои собственные таблицы данных. Он также позволяет объекту действовать как класс, содержащий конструктор и набор связанных методов.
Функция может быть членом объекта. Когда функция является членом объекта, она называется методом. Существует специальная переменная, называемая так, которая задается объекту при вызове метода объекта.
Например, в выражении foo.bar() эта переменная устанавливается как объект foo как дополнительный аргумент для панели функций. Затем панель функций может ссылаться на это, чтобы получить доступ к интересующему объекту.
В более глубоком выражении, таком как do.re.mi.fa(), эта переменная устанавливается на объект do.re.mi, а не на объект. В простом вызове функции это устанавливается для Глобального объекта (aka window), что не очень полезно. Правильное поведение должно было состоять в том, чтобы сохранить текущее значение этого, особенно при вызове внутренних функций.
Также 'this' может меняться в зависимости от того, как вызывается ваша функция, читать применить функцию и функция вызова.
Я бы порекомендовал вам потратить время на изучение одного из самых больших умов в его (бесплатных) презентациях, связанных с здесь.
В JavaScript соглашение (и это только соглашение) заключается в том, что любая функция, начинающаяся с большой буквы, должна использоваться как конструктор. Тогда можно было бы назвать
var foo = new Foo()
и this
будут ссылаться на вновь созданный объект, на который будет ссылаться foo
.
Конечно, нет ничего, что помешало бы вам вызвать Foo()
самостоятельно, и в этом случае this
будет ссылаться на объект, из которого была вызвана функция. Чтобы избежать путаницы, это не рекомендуется.
В JavaScript все объекты являются объектными функциями. Когда вы скажете this.foo
в следующем коде
function Foo()
{
this.foo = "bar"; // <- What is "this" here?
}
foo
становится переменной-членом объекта foo