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

Мой вопрос:

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

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

50
задан Justin Johnson 26 December 2009 в 12:32
поделиться

4 ответа

Ключевое слово 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
63
ответ дан 7 November 2019 в 10:51
поделиться

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

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

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

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

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

Также «this» может изменяться в зависимости от того, как вызывается ваша функция, читайте в apply function и ] call function .

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

24
ответ дан 7 November 2019 в 10:51
поделиться

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

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

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

7
ответ дан 7 November 2019 в 10:51
поделиться

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

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

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

0
ответ дан 7 November 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: