这个值在JavaScript匿名函数中

时间:2011-12-29 17:07:05

标签: javascript this anonymous-function

有人可以向我解释为什么A为真且B为假?我本以为B也是如此。

function MyObject() {

};

MyObject.prototype.test = function () {
    console.log("A", this instanceof MyObject);
    (function () {
        console.log("B", this instanceof MyObject);
    }());
}

new MyObject().test();

4 个答案:

答案 0 :(得分:32)

您的匿名函数this内部是全局对象。

test内部,这是调用该方法的MyObject实例。


每当你调用这样的函数时:

somceFunction(); // called function invocation

this 始终全局对象,或undefined处于严格模式(除非使用someFunction 创建bind ** - 见下文)

每当你调用这样的函数时

foo.someMethod();  //called method invocation

this设置为foo


** EcmaScript5定义了一个bind函数,允许您创建一个具有[{1}}预设值的函数

所以这个

this

导致 var obj = { a: 12 }; var someFunction = (function () { alert(this.a); }).bind(obj); someFunction(); 调用someFucntion等于this,并发出警报12.我提出这一点只是为了注意这是我提到的关于函数的规则的一个潜在例外被调用为

obj

始终使someFunction(); 等于全局对象(或严格模式下为this

答案 1 :(得分:18)

this很特别。它指的是代表函数被调用的对象(最常见的是通过点语法)。

因此,在A的情况下,代表新的MyObject对象调用该函数。 B处于不代表任何对象显式调用的不同函数中,因此this默认为全局对象(window)。

换句话说,this的变化取决于函数的调用方式,而不是它的定义位置和方式。您使用匿名函数(在另一个函数中定义)的事实是巧合的,并且对this的值没有影响。

答案 2 :(得分:6)

在匿名函数中,this绑定到全局对象(浏览器环境中为window)。

有多种方法可以访问实例:

var self = this;
(function () {
    console.log("B", self instanceof MyObject);
}());

(function () {
    console.log("B", this instanceof MyObject);
}).call(this);

答案 3 :(得分:4)

根据您调用该函数的方式设置

this 您的匿名函数是正常的函数调用,因此this是全局对象。

您可以写(function() { ... }).call(this)this明确调用它。