以下任何人都可以在innerF
中详细说明,this
指的是什么? User
或innerF
?
function User(){
this.id = 1;
};
User.prototype.sayHi = function(){
var innerF = function(){
this.id = 2; // "this" refers to User or innerF ?
};
return innerF;
};
new
关键字或匿名功能是否与更改this
关键字的引用有关?
如果我这样称呼它会怎么样:
var u = User;
var f = u.sayHi();
f();
或者
var u = new User;
var f = u.sayHi();
f();
由于
答案 0 :(得分:6)
this
本地在innerF
内引用的内容取决于最终如何调用该函数。可以通过各种方式调用它来改变this
的含义。例如
var u = new User();
var innerF = u.sayHi();
innerF(); // 'this' is window
innerF.call(u); // 'this' is 'u'
innerF.call("hello"); // 'this' is "hello"
根据您的代码,您似乎希望this
引用调用User
的{{1}}实例。如果是,那么您需要将sayHi
存储在本地,并在this
中引用该本地。
innerF
请注意,User.prototype.sayHi = function(){
var self = this;
var innerF = function(){
self.id = 2;
};
return innerF;
};
内的this
不能保证指向sayHi
实例。一般来说,User
可以对sayHi
执行相同的操作。例如
innerF
答案 1 :(得分:2)
您没有在该代码中调用该函数,因此它尚未引用任何内容。
调用函数时确定this
的值,而不是定义它(除非您使用类似bind
的内容)。
答案 2 :(得分:1)
var u = User;
var f = u.sayHi();
f();
上面的代码会抛出错误。 User
是一个函数,而不是User
对象,因此它没有方法sayHi
,因此您将收到以下错误。
Uncaught TypeError: Object function User(){
this.id = 1;
} has no method 'sayHi'
var u = new User;
var f = u.sayHi();
f();
上面的代码不会抛出错误,而u
是User
的对象,(how new worksfrom mdn),它的方法sayHi
会返回一个函数,然后执行函数f();
,因此函数内部的this
在调用函数时引用当前上下文。因此,如果您的代码在全局范围内,则this
引用window
对象。
您可以按f.call(u);
设置上下文,然后this
引用对象u
,并将用户对象u
的ID更改为2。