2015-09-06 2 views
2

Итак, я читал книгу Professional Javascript для веб-разработчиков и натолкнулся на следующие примеры.Javascript это undefined после назначения функции

var object = { 
    name: "my Object", 
    getName: function() { 
    return this.name; 
    } 
} 

Затем автор показывает следующие результаты:

object.getName(); // "my Object" 
(object.getName)(); // "my Object" 
(object.getName = object.getName)() // "undefined" 

Я понимаю, первый случай, но имеют следующие вопросы для случая 2 и случая 3.

Случай 2: Что положить круглые скобки вокруг object.getName? До сих пор я знаю только, что вы можете поместить круглые скобки вокруг анонимной функции, чтобы вызывать ее немедленно (непосредственное выражение функции). Но что, если функция не анонимна?

Дело 3: Почему this не поддерживается после назначения?

+1

см. Это [сообщение] (http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) о 'this' – Grundy

+0

Ввод функции вокруг' object.getName' в случае 2 ничего не делает; поэтому вы получаете тот же результат, что и случай 1. – Pointy

+1

В браузерах последний пример не возвращает * undefined *, он возвращает пустую строку. Функция вызывается без установки * this *, поэтому она будет по умолчанию для глобального объекта (или не определена в строгом режиме, но это не строгий режимный код), который является * окном * в браузере, а у оконных объектов по умолчанию * name * свойство, которое, если не установлено какое-либо значение, будет пустой строкой. – RobG

ответ

1

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

Когда ссылка на функцию получена путем оценки ссылки на свойство объекта, а затем эта функция вызывается, JavaScript гарантирует, что функция this в функции установлена ​​на объект. Вот как работают первые два случая.

В третьем случае опорная функция первоначально получена от объекта, но общее значение

(object.getName = object.getName) 

является значением этого = задания. Из-за этого связь с объектом нарушена, и все, что у вас есть, - это ссылка на функцию. Поэтому вызов не будет устанавливать this. Это как если бы вы написали:

var something = object.getName; 
something(); 

Это также не будет устанавливать this в object. Только в том случае, когда ссылка на функцию поступает прямо из операции или [ ], объект будет в конечном итоге this. Скобки в случае 2 представляют собой особый случай; в JavaScript круглые скобки не оцениваются ничем; они влияют на то, как выражение анализируется, но они не делают ничего активного.

+0

Могу ли я задать только один вопрос - console.log в случае 3. возвращает строку (?) 'Result'. Что это значит? – sinisake

+0

@nevermind well функция 'getName' по-прежнему вызывается, причем' this' установлен в 'window', поэтому вы видите значение' window.name'. – Pointy

+0

спасибо! Да, я думал, что «это» связано с глобальным объектом в 3. случае, просто «результат» меня смутил, ожидал «неопределенный» ... (jsfiddle :)) – sinisake

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