Javascript 我不明白这指的是什么

Javascript 我不明白这指的是什么,javascript,Javascript,有谁能在下面的innerF中详细说明一下,这个指的是什么用户或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关键字或匿名函数是否与更改此关键字的引用

有谁能在下面的
innerF
中详细说明一下,这个
指的是什么<代码>用户
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
关键字或匿名函数是否与更改
关键字的引用有关

如果我这样称呼它呢:

var u = User;
var f = u.sayHi();
f();


谢谢

您没有在该代码中调用函数,因此它还没有引用任何内容


this
的值是在调用函数时确定的,而不是定义它(除非您使用类似于
bind
的东西)。

thislocal在
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"
var sayHi = u.sayHi;
sayHi();   // 'this' is window
基于您的代码,尽管您似乎希望
引用调用了
sayHi
用户
的实例。如果是这样,则需要将
存储在本地文件中,并在
innerF
中引用该本地文件

User.prototype.sayHi = function(){
    var self = this;
    var innerF = function(){
        self.id = 2; 
    };

    return innerF;
};
请注意,
sayHi中的
this
也不能保证指向
User
实例。一般来说,可以对
sayHi
执行与对
innerF
相同的技巧。比如说

var u = new User();
var innerF = u.sayHi();
innerF();              // 'this' is window
innerF.call(u);        // 'this' is 'u'
innerF.call("hello");  // 'this' is "hello"
var sayHi = u.sayHi;
sayHi();   // 'this' is window
上面的代码将抛出错误
User
是一个函数,而不是
User
对象,因此它没有方法
sayHi
,因此您将得到下面的错误

Uncaught TypeError: Object function User(){
  this.id = 1;
} has no method 'sayHi'

上面的代码不会抛出错误,
u
User
,()的对象,它的方法
sayHi
返回一个函数,您通过
f()执行该函数
,因此调用函数时,函数内部的
this
引用当前上下文。因此,如果您的代码在全局范围内,
this
引用的是
窗口
对象


您可以通过
f.call(u)设置上下文
,然后
这个
引用了对象
u
,您将用户对象
u
的id更改为2。

@Topener:我不知道如何尝试,学习JS:)@Topener:好像我成功地调用了它。您能详细说明调用如何影响
这个
的引用吗?用密码。Thanks@Dev555:进行一些研究,阅读一些文档:谢谢,但我想让
引用
innerF
,我还提供了运行它的代码。@Dev555:您想
引用函数本身吗?为什么不使用
innerF.id=…
而不是
this
?@Dev555如果您希望
this
引用特定的内容,您必须使用
调用()
(如此答案所示)或
var u = new User;
var f = u.sayHi();
f();