Reputation: 366
I get confused on a JavaScript this
reference situation.
I am working on a code that I declare function inside an object method. (The reason is to tidy up code inside an object method, while keeping the functions private to the method.)
The following is an experiment to re-produce my problem.
I found that the this
inside greeting
function refers to the window scope instead of person scope.
var person = {
nickname: "Makzan",
sayHi: function() {
console.log(this);
var greeting = function() {
console.log(this);
return "Aloha " + this.nickname;
}
console.log(greeting());
}
}
person.sayHi();
(same code in jsfiddle: http://jsfiddle.net/makzan/z5Zmm/)
And this is the log result in browser:
> Object
> Window
Aloha undefined
In JS, I know that this reference is tricky. And I can change the scope by using .call
method to make this code works.
var greeting = (function() {
console.log(this);
return "Aloha " + this.nickname;
}).call(this);
However, I am curious to know why by default the this
refer to window scope inside the greeting method?
Thanks in advance for all your help.
Upvotes: 20
Views: 10417
Reputation: 29453
If we modify your code a little, we can see that this works:
var person = {
nickname: "Makzan",
greeting: function () {return "Aloha " + this.nickname;},
sayHi: function () {return console.log(this.greeting());}
}
person.sayHi();
So we may conclude the reason that this doesn't:
var person = {
nickname: "Makzan",
sayHi: function () {var greeting = function () {return "Aloha " + this.nickname}; console.log(greeting()); }
};
person.sayHi();
is because for greeting()
to have the this
context of the person
object, it must be explicitly declared as a direct property of the person
object.
Upvotes: 0
Reputation: 388316
The this
, references is not related to scope, it depends on the calling context.
As per the MDN doc,
In general, the object bound to this in the current scope is determined by how the current function was called
Upvotes: 4
Reputation: 943250
this
has nothing to do with scope. It is determined by context.
greeting()
calls the function with no context, so this
is the default object (window
in a browser).
Upvotes: 14
Reputation: 112
Try person.nickname, this refers to the var greeting in your case
Upvotes: 2