【问题标题】:this value in JavaScript anonymous functionJavaScript 匿名函数中的 this 值
【发布时间】:2011-12-29 17:07:04
【问题描述】:

谁能向我解释为什么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();

更新: 从 ecmascript-6 开始,您可以使用箭头函数,这样可以很容易地像这样引用 MyObject:

function MyObject() {

};

MyObject.prototype.test = function () {
    console.log("A", this instanceof MyObject);
    (() => {//a change is here, which will have the effect of the next line resulting in true
        console.log("B", this instanceof MyObject);
    })(); //and here is a change
}

new MyObject().test();    

【问题讨论】:

  • 欢迎来到 JavaScript 中的函数作用域。
  • @zzzzBov:这不是闭包。
  • 您可能希望使用额外的一对括号来提高可读性:( new MyObject() ).test()
  • @SLaks,我编辑了我的评论以正确反映匿名函数的用法,尽管它被用作闭包。
  • 否;它没有被用作闭包。它没有结束任何事情。范围并不真正相关。

标签: javascript ecmascript-6 this anonymous-function


【解决方案1】:

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

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


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

somceFunction(); // called function invocation

this始终是全局对象,或者在严格模式下是 undefined(除非 someFunction 是用 bind** 创建的——见下文)

每当你调用这样的函数时

foo.someMethod();  //called method invocation

this 设置为foo


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

所以这个

    var obj = { a: 12 };
    var someFunction = (function () { alert(this.a); }).bind(obj);
    someFunction();

导致someFucntion 被调用,this 等于 obj,并发出警报 12。我提出这一点只是为了注意这是我提到的关于函数调用的规则的潜在例外

someFunction();

始终使this 等于全局对象(或在严格模式下为undefined

【讨论】:

  • (function () { alert(this.a); }).bind(obj) 行正是我所寻找的——将上下文绑定到匿名函数。完美运行,+1
  • 你也可以使用func.call(this, arg1, arg2..)设置this
【解决方案2】:

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

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

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

【讨论】:

  • 您的声明“this 会根据函数的调用方式而变化,而不是在何处或如何定义”,这可能会产生误导。事实上,this 只是被调用函数的所有者——它本身总是被显式定义或默认为全局对象。 myVar.doSomething = doSomething; 将函数myVar.doSomething 定义为doSomething,其中this 在调用myVar.doSomething() 时将始终引用myVar,无论从何处调用myVar.doSomething()。你的陈述可能另有说明。
【解决方案3】:

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

访问实例有多种方式:

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

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

【讨论】:

    【解决方案4】:

    this 是根据您调用函数的方式设置的。
    你的匿名函数是一个普通的函数调用,所以this是全局对象。

    您可以写 (function() { ... }).call(this) 以使用您的 this 显式调用它。

    【讨论】:

    • 好吧,我假设是严格模式,所以...:)
    • ...所以thisundefined
    猜你喜欢
    • 2012-05-10
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多