Что означают эти "this" в этом JavaScript-коде?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>test</title>

    </head>
    <body>
        <script type="text/javascript" charset="utf-8">
            (function(){
                // this
                var test=function(){
                    //this
                    return function(){
                        //this
                    };
                }

                (function(){
                    //this
                    var a={
                        p1:function(){
                            //this
                        }
                    };
                })();
            })();
        </script>       
    </body>
</html>

Ответ 1

Дэвид Доорвар уже упомянул о JavaScript: "Хорошие детали" Дугласа Крокфорда.

Из раздела 4.3 этой прекрасной книги:

Вызов функции приостанавливает выполнение текущей функции, передавая управление и параметры на новая функция. В добавок к объявленные параметры, каждая функция получает два дополнительных параметра: это и аргументы. Этот параметр очень важно в объектно-ориентированном программирования, а его значение определяемый шаблоном вызова. Существует четыре шаблона вызова в JavaScript: вызов метода шаблон, вызов функции шаблон, вызов конструктора шаблон и вызов приложения шаблон. Модели отличаются тем, как бонусный параметр - это инициализированы.

Крокфорд продолжает объяснять привязку 'this' в каждом из этих шаблонов следующим образом:

Шаблон вызова метода:. Когда функция хранится как свойство объекта, мы называем ее методом. Когда метод вызывается, это связано с этим объектом.

Шаблон вызова функции: Когда функция вызывается с помощью этого шаблона, это связано с глобальным объектом. Это было ошибкой в ​​оформлении языка.

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

Шаблон Apply Invocation:. Метод apply позволяет нам построить массив аргументов, используемых для вызова функции. Это также позволяет нам выбрать значение этого. Метод apply принимает два параметра. Первое - это значение, которое должно быть связано с этим. Второй - это массив параметров.

Ответ 2

Значение this зависит от того, как содержащая его функция называлась, а не как построена.

Существует отличное объяснение того, как оно работает в JavaScript: хорошие части.

Короткий вариант заключается в том, что когда вы вызываете функцию (m) как метод объекта (o), то this есть o.

var o = {
   m: function () {
      return this;
   }
}

var foo = {
    bar: o.m;
}

o === o.m();
foo === foo.bar();

Ответ 3

кроме this является комментарием

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

например, это в

p1:function(){
       //this
   }

то это выше

(function(){
  //this
  var a={
   p1:function()

Затем this над ним

 (function(){
    // this
    var test=function(){

Существует хорошая презентация Николаса Закаса в Yahoo по адресу http://www.youtube.com/watch?v=mHtdZgou0qU

Ответ 4

Лучше всего посмотреть на закрытие javascript, понять области и назначение этого указателя. "this" появился еще до Object-ориентированного программирования, но определенно необходим для него.

http://jibbering.com/faq/notes/closures/

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

Простым объяснением закрытия является то, что ECMAScript допускает внутреннюю функции; определения функций и выражения функций, которые внутри функциональных кодов других функций.


Свойства, созданные на объекте Variable, которые соответствуют объявленные локальные переменные изначально присваиваются значениям undefinedпри переменном экземпляре фактическая инициализация локальных переменные не происходят до тех пор, пока оценка соответствующих выражения присваивания во время выполнения кода тела функции.

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

Наконец, значение присваивается для использования с этим ключевым словом. Если присваивание значения относится к объекту, тогда свойства с эталонными ссылочными свойствами этого объекта. Если присвоенное значение (внутренне) равно нулю, тогда это ключевое слово будет ссылаться к глобальному объекту.

Глобальный контекст выполнения получает немного отличающуюся обработку, поскольку он не имеет аргументов, поэтому ему не требуется определенная активация объект для ссылки на них. Контекст глобального выполнения необходим область охвата и ее цепочка областей действия состоят именно из одного объекта, глобального объект. Глобальный контекст выполнения проходит через переменную экземпляр, его внутренние функции являются нормальной функцией верхнего уровня объявления, составляющие основную часть кода javascript. Глобальный объект используется как объект Variable, поэтому объявляется глобально функции становятся свойствами глобального объекта. Как и во всем мире объявленные переменные.

В глобальном контексте выполнения также используется ссылка на глобальную объект для этого объекта. Отпуск http://jibbering.com/faq/notes/closures/глава: Разрешение идентификатора, Контексты выполнения и цепочки областей