Подтвердить что ты не робот

Эта внутренняя функция

Мой вопрос:

function Foo()
{
   this.foo = "bar"; // <- What is "this" here?
}

Из того, что я могу сказать, зависит от того, как используется Foo, т.е. как конструктор или как функция. Что может this быть в разных обстоятельствах?

4b9b3361

Ответ 1

Ключевое слово 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

Ответ 2

Прочитайте, что должен сказать Дуглас Крокфорд по этому поводу, процитировать его от Обзор языка программирования JavaScript:

Функция - это объект. Он может содержать участников так же, как и другие объекты. Это позволяет функции содержать свои собственные таблицы данных. Он также позволяет объекту действовать как класс, содержащий конструктор и набор связанных методов.

Функция может быть членом объекта. Когда функция является членом объекта, она называется методом. Существует специальная переменная, называемая так, которая задается объекту при вызове метода объекта.

Например, в выражении foo.bar() эта переменная устанавливается как объект foo как дополнительный аргумент для панели функций. Затем панель функций может ссылаться на это, чтобы получить доступ к интересующему объекту.

В более глубоком выражении, таком как do.re.mi.fa(), эта переменная устанавливается на объект do.re.mi, а не на объект. В простом вызове функции это устанавливается для Глобального объекта (aka window), что не очень полезно. Правильное поведение должно было состоять в том, чтобы сохранить текущее значение этого, особенно при вызове внутренних функций.

Также 'this' может меняться в зависимости от того, как вызывается ваша функция, читать применить функцию и функция вызова.

Я бы порекомендовал вам потратить время на изучение одного из самых больших умов в его (бесплатных) презентациях, связанных с здесь.

Ответ 3

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

var foo = new Foo() и this будут ссылаться на вновь созданный объект, на который будет ссылаться foo.

Конечно, нет ничего, что помешало бы вам вызвать Foo() самостоятельно, и в этом случае this будет ссылаться на объект, из которого была вызвана функция. Чтобы избежать путаницы, это не рекомендуется.

Ответ 4

В JavaScript все объекты являются объектными функциями. Когда вы скажете this.foo в следующем коде

function Foo()
{
   this.foo = "bar"; // <- What is "this" here?
}

foo становится переменной-членом объекта foo