эта внутренняя функция - PullRequest
46 голосов
/ 26 декабря 2009

Мой вопрос:

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

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

Ответы [ 5 ]

60 голосов
/ 26 декабря 2009

Ключевое слово 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
21 голосов
/ 26 декабря 2009

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

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

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

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

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

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

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

6 голосов
/ 26 декабря 2009

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

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

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

3 голосов
/ 11 июня 2018

Это зависит от того, как эта функция используется, есть два основных типа, в которых мы можем использовать функции

  1. Функция
  2. Функция как объект с использованием нового ключевого слова

увидит по одному

1.Function

var example = function () {
  console.log(this);
};

example();

Output : window

Здесь ключевое слово this указывает на объект окна.

По умолчанию это всегда должно быть окно Object, которое ссылается на корень - глобальную область видимости. Поэтому, когда мы console.log (это); из нашей функции, так как она вызывается окном (просто вызывается), мы должны ожидать, что значением this будет наш объект Window:

2.Функция как объект

var example = function () {
  console.log(this);
};

var obj = new example();

Output : example {}

Здесь ключевое слово this указывает на вновь созданный пример объекта.

0 голосов
/ 26 декабря 2009

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

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

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

...