2009-07-13 3 views
-2
<!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> 
+5

Пожалуйста, обратите внимание, что Javascript содержала может быть менее простым, чем рекламируемая. Принять условия. Предложение не действует в Канаде. – Greg

+2

Просто скопируйте какой-нибудь код, не создавайте хороший вопрос. -1 – Boldewyn

ответ

13

David Dorward уже упомянул о JavaScript: хорошие детали от Douglas Crockford.

Из раздела 4.3 этой замечательной книги:

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

Крокфорд продолжает объясняет связывание «это» в каждой из этих моделей, а именно:

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

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

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

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

+0

ничего о шаблоне вызова «вызов» ('fn.call (context, arg1, arg2, ... argn)')? –

+1

@ gion_13, в терминах 'this' он эквивалентен« Применить шаблон вызова », [см. Соответствующий ответ] (http://stackoverflow.com/a/1986909/562906) – sinelaw

1

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

Значение this зависит от того, как его содержала под названием, а не как построено.

Существует отличное объяснение того, как это работает в JavaScript: The Good Parts.

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

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

var foo = { 
    bar: o.m; 
} 

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

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

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

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

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


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

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

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

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

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

Смежные вопросы