Путаница по поводу этого, глобального объекта и глобальной области видимости - PullRequest
2 голосов
/ 18 ноября 2011

Чтение Дага «Javascript: части товара» в главе 4 о функциях говорит о «Шаблоне вызова метода» и «Шаблоне вызова функции» (стр. 28).

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

Это ясно.Затем на той же странице:

Когда функция не является свойством объекта, она вызывается как функция:
var sum = add (3, 4);// сумма равна 7
Когда функция вызывается с этим шаблоном, this привязывается к глобальному объекту.Это было ошибкой в ​​дизайне языка.

Мои вопросы:

  • 1.- С "это связано с глобальным объектом" означает, что это связано с глобальной областью видимости?
  • 2.- С "Это была ошибка в дизайне языка" означает, что этот должен следовать тем же правилам, что иметоды следуют?т. е. связаны это с самим собой?

Спасибо .-

РЕДАКТИРОВАТЬ : Оба приведенных ответа очень поучительны и хорошо документированы.Спасибо всем участникам.

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

1 - Да

2 - Если вы продолжаете читать, сразу после этого он описывает пример, который делает его «ошибкой в ​​разработке языка».

var myObject = {
  value: 1
};

myObject.double = function() {
  var that = this;

  var helper = function() {
    alert('in helper, this.value = ' + this.value + ' and that.value = ' + that.value);
    that.value = that.value + that.value;
  }

  helper();
};

myObject.double();
alert('after doubling, myObject.value = ' + myObject.value);

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

1 голос
/ 18 ноября 2011

window - глобальный объект в JavaScript. Если вы определите функцию как это:

function myFunc() {
}

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

var obj = {
   myMethod: function() {
   }
};

И используйте this, это будет ссылаться на объект.

Вот пример: http://jsfiddle.net/williamvanr/qBXF8/

...