2013-04-19 3 views
4
var name = "the Window."; 
var object = { 
    name:"Object", 
    getName: function(){ 
     return this.name; 
    } 
} 
(object.getName)(); //"Object" 
(object.getName = object.getName)(); //"the Window" 

Я запустил этот код, и он возвращает «Окно», в то время как я думаю, что это должен быть «Объект». Пожалуйста, скажите мне, почему? Благодарю.О «this» в javascript

+0

https: //developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this – AurA

+0

Значение * this * внутри функции зависит от того, как она называется *, а не * как и где она определена *. «Это», безусловно, должно быть самым обсуждаемым в SO. – techfoobar

+0

Взгляните на это: http://stackoverflow.com/questions/3127429/javascript-this-keyword –

ответ

3
var name = "the Window."; 

Глобальные декларации создают свойство глобального/оконного объекта. Это эквивалентно (более или менее), чтобы:

var global = this; 
global.name = 'the Window'; 

Выражение:

(object.getName = object.getName) 

возвращает функцию, на который ссылается object.getName. Следующий пустой список параметров (т. Е. ()) вызывает его вызов.

Поскольку это значение не задано при вызове, то по умолчанию глобальный объект/окна, так что функция возвращает значение global.name.

+0

но почему (object.getName)() возвращает «Объект»? –

+0

Потому что, когда вы вызываете функцию как метод 'object', ее' this' ссылается на «объект». Поэтому 'this.name' возвращает' object.name', который представляет собой строку «Object». Возможно, вы должны использовать несколько разных значений, чтобы сделать их более ясными. – RobG

+0

Хорошо, я знал это. Спасибо –

1

Суть путаницы мы пытаемся выполнить

(object.getName = object.getName)(); 

и мы считаем, что он должен напечатать «объект».

Собственно, это не так. Вот простая причина. Если вы разделите это заявление на 2 заявления, вы получите его.

  • Назначение: object.getName назначается некоторый обработчик. В этом случае он присваивается самому себе.
  • Выполнение обработчика. Теперь обработчик завершен, но на этот раз у нас нет контекста. Обработчик выполняется окном. Таким образом, вы получаете window.name, которое является «окном».

Попробуйте

var x = object.getName; 
x(); 

Это несколько похоже на ваш случай, и это дает «окно». по той же причине x выполняется окном.

0

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

В вашем примере кода window - это контекст для вызова getName, независимо от того, где объявлена ​​эта функция.

0
var x = object.getName; 
x(); 

не совсем то же самое. «=» убедитесь, что x ссылается на тот же адрес памяти, что и object.getName, но x принадлежит окну, а object.getName принадлежит объекту. Я думаю, проблема связана с возвращаемым значением выражения присваивания. может быть, есть временная переменная, чтобы получить значение (object.getName = object.getName), то есть,

var temp = (object.getName = object.getName); 
temp();//"the Window" 

, таким образом, может иметь смысл.