我最近开始学习Javascript,同时使用此代码中的代码进行一些实验:
var k = {
ab: "hi",
func: function() {
console.log("inner1" + this.ab);
(function() {
console.log("inner2 " + this.ab)
}())
}
};
k.func();
这段代码给我的结果是“inner1 hi”和“inner2 undefined”。
我没有理解为什么undefined
在第二console.log
?
答案 0 :(得分:7)
当你调用它时,函数的this
被绑定,具体取决于你如何调用它。将其称为值而不是属性 - (expression)()
而非object.method()
- 将导致this
设置为全局对象,或undefined
处于严格模式。
函数对象有两种方法可以使用明确指定的this
:call
和apply
来调用函数。你可以在这里使用前者。
(function() {
console.log("inner2 " + this.ab);
}.call(this));
这会将调用函数的this
转发给内部函数。
或者,您可以将this
分配给变量。
var that = this;
(function() {
console.log("inner2 " + that.ab);
}());
答案 1 :(得分:2)
string
执行匿名函数会更改实例,以保持上下文执行:
var k = {
ab: "hi",
func: function() {
console.log(this,"inner1" + this.ab);
(function() {
console.log(this,"inner2 " + this.ab)
}())
}
};
k.func();
答案 2 :(得分:2)
@minitech和@Issac很好地解释了问题和解决方案。在任何级别获取属性的另一种方法是按对象。在你的代码中是:
var k = {
ab: "hi",
func: function() {
console.log("inner1" + this.ab);
(function() {
console.log("inner2 " + k.ab)
}())
}
};
k.func();
答案 3 :(得分:1)
您没有在第二个功能中使用this
的任何参考。相反,您可以使用:
(function() {
console.log("inner2 " + this.ab)
}.call(this))
答案 4 :(得分:1)
在你的例子中,这个'是指基于范围的两种不同的东西。您可以使用此示例代码。也许它可以帮助你理解基础知识。
var k = {
ab: "hi",
func: function() {
var me = this; // save 'meaning of this' in variable me.
console.log("inner1" + this.ab);
(function() {
console.log("inner2 " + me.ab)
}())
}
};
k.func();