Ключевое слово this относится к какому объекту внутри функции внутри другой функции? - PullRequest
5 голосов
/ 29 января 2010

В основном я пытаюсь понять и изучить принцип работы этого ключевого слова в JavaScript.

Насколько я понимаю, «это» относится к объекту (функции), который находится внутри в этот момент.

Итак, веря в это, я хотел проверить вывод простого кода ниже:

<body>

<input type="button" value="Add Age" onclick="Outer()" />

<script type="text/javascript">

function Outer(){

if(typeof this.Father == 'undefined')
    {
        this.Father = 0; 
    }

this.Father+=2;
alert(this.Father);

inner();

        function inner(){
            if(typeof this.Son== 'undefined')
            {
                this.Son = 0;
            };

            this.Son++;
            alert(this.Son);
            alert(this.Father);
        };
};
</script>
</body>

И его вывод меня смущает. Потому что в функции inner () this.Son выводит увеличенное целочисленное значение Son. Но я ожидаю, что this.Father потерпит неудачу, потому что inner () не имеет атрибут .Father. Но вместо того, чтобы генерировать исключение, оно предупреждает значение this. Father -Which, кажется

  • строка выше 'this' ссылается на inner ()
  • и следующая строка this указывает Outer ()

На данный момент у меня есть 2 вопроса на самом деле:

  1. Всегда ли ключевое слово "this" относится к корпус внешнего прицела даже внутри внутренних функций?

  2. И без каких-либо экземпляров, объявленных ключевым словом this, что в методе? (Я имею в виду, не имея что-то вроде var myFamily = new Outer())

Спасибо

Бурак Оздоган

1 Ответ

5 голосов
/ 29 января 2010

this определяется шаблоном вызова, то есть тем, как вызывается функциональный объект.

Существует 4 различных типа шаблонов вызова:

  1. вызов метода: функция определяется как свойство некоторого объекта и вызывается через объект с использованием уточнения, то есть ..

    a.func (); // this относится к объекту, т.е. a.

  2. вызов функции: простой вызов функции.

    FUNC (); // this является связью с глобальным объектом.

  3. вызов конструктора: ну, это немного сложно. Так как конструкторы используются как метод констурктора для новых объектов функций, являющихся new, this относится к создаваемому объекту новой функции.

    var func = new Func (); // this ссылается на func в конструкторе Func)

  4. применить вызов:

    func.apply (thisArg, argArray); // this является связью с первым аргументом

Другими словами, this в вашем примере все относится к глобальному объекту (ваш onClick вызов Other()). Вы должны попробовать использовать new Other().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...