Что означают эти слова в этом коде JavaScript? - PullRequest
0 голосов
/ 13 июля 2009
<!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>

Ответы [ 4 ]

14 голосов
/ 13 июля 2009

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

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

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

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

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

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

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

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

4 голосов
/ 13 июля 2009

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

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

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

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

var foo = {
    bar: o.m;
}

o === o.m();
foo === foo.bar();
1 голос
/ 13 июля 2009

кроме 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

0 голосов
/ 19 августа 2011

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

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

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

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


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

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

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

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

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

...