不能理解这是指什么

时间:2012-02-14 15:47:11

标签: javascript

以下任何人都可以在innerF中详细说明,this指的是什么? UserinnerF

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();

由于

3 个答案:

答案 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();

上面的代码不会抛出错误,而uUser的对象,(how new worksfrom mdn),它的方法sayHi会返回一个函数,然后执行函数f();,因此函数内部的this在调用函数时引用当前上下文。因此,如果您的代码在全局范围内,则this引用window对象。

您可以按f.call(u);设置上下文,然后this引用对象u,并将用户对象u的ID更改为2。