2014-08-31 2 views
1

У меня есть модуль ...Почему ссылка на «this» возвращает значение, оно должно быть неопределенным?

var myModule = (function(){ 

    var obj = new Object(); 
    obj.name = ""; 
    obj.sayName = function(){ 
     obj.name = "jon"; 
     console.log(obj.name); 
     console.log(this.name); 
    } 
    return obj; 

})() 

myModule.sayName(); 

Это печатает слово «джон» дважды в соответствии с console.log заявления.

Однако я не понимаю, почему «это» правильно, так как оно вернет ссылку на функцию и будет «неопределенным», не так ли?

+2

'' '' 'obj', потому что' obj' является 'myModule', и вы вызываете функцию как' myModule.sayName() ', обратите внимание на точку. – elclanrs

+0

Но я думал, потому что это новая функция, которую он получит, это собственное закрытие? – Exitos

+0

Это не имеет никакого отношения к закрытию или сфере видимости, а скорее к тому, как это работает в javascript. В основном, если вызывается как 'a.b.c()' 'this' в' c', ссылается на фамилию перед последней точкой - 'b'. Таким образом, в вашем случае имя до последней точки - 'myModule'. См. Этот ответ для получения дополнительной информации: http://stackoverflow.com/questions/13441307/how-does-the-this-keyword-in-javascript-act-within-an-object-literal/13441628#13441628 – slebetman

ответ

3

Вы звоните myModule.sayName() так this внутри sayName is myModule.

Значение myModule является копией ссылки на объект от obj (так как это то, что возвращается с анонимного IIFE).

Поэтомуи this.name - это то же значение.

+0

, но я думал у функции sayname есть собственное закрытие всего этого? Я должен был бы присвоить это «я» в более высокой функции? – Exitos

+3

@Exitos: 'sayName' действительно является закрытием (над« obj »и несколькими другими вещами), но это не имеет никакого отношения к тому, что« это »внутри него. 'this' в первую очередь определяется тем, как называется функция, как сказал Квентин. Когда вы вызываете функцию через выражение, получающее ссылку на функцию из свойства объекта ('myModule.sayName();'), во время вызова функции «это» будет объектом, из которого вы получили свойство (обычно, там являются * связанными * функциями, которые работают по-другому, а функции стрелок ES6 будут работать по-другому, но ваше 'sayName' является нормальным. –

+0

Спасибо, парни .... – Exitos

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