JavaScript这个关键字是如何工作的?

JavaScript这个关键字是如何工作的?,javascript,object,this,Javascript,Object,This,我一直在做一些JavaScript开发,我遇到了这个问题。考虑下面的代码 var obj = {}; obj.bind = function () { console.info(this); }; obj.bind(); 我正在FireBug JavaScript控制台上运行代码。预期结果是,此在控制台中显示对对象的引用 它实际上显示未定义的 但是,当我更改代码时 var obj = {}; obj.bind = function () { this.x = 'x'; console.inf

我一直在做一些JavaScript开发,我遇到了这个问题。考虑下面的代码

var obj = {};
obj.bind = function () {
console.info(this);
};

obj.bind();
我正在FireBug JavaScript控制台上运行代码。预期结果是,
在控制台中显示对对象的引用

它实际上显示
未定义的

但是,当我更改代码时

var obj = {};
obj.bind = function () {
this.x = 'x';
console.info(this);
};

obj.bind();
现在,控制台显示
的预期值,它是对
obj
对象的引用


为什么会发生这种情况?

undefined
是函数的返回值,由于没有显式返回值,因此将得到该值

在Chrome和Firebug中,它在返回值
未定义之前在控制台中正确显示对象

因此,如果你这样做:

var obj = {};
    obj.bind = function () {
    console.info(this);
    return "foo";
};

obj.bind();
…您应该看到如下内容:

Object {   }
"foo"
如果Firebug在对象为空时没有显示该对象,您可能需要检查以确保使用的是最新版本。

在您的示例中,“这”应该是obj,正如一些评论者指出的那样。以下是解释原因的详细信息--

在Javascript中,“this”的值根据调用函数的方式而变化:

  • 当函数存储为对象上的属性,并且通过调用obj.foo()调用该函数时,“this”将是obj
  • 例:

  • 当您使用不引用任何拥有对象的语法调用函数时,“this”将是全局环境
  • 例:

  • 当您使用new操作符调用函数时,就像调用构造函数一样,一个新对象将为您实例化,“this”将指向该新对象
  • 例:

    //结果将是{x:42}

  • 使用call()或apply()时,可以控制“this”是什么

  • (这里没有示例,因为这与您的问题相去甚远。请在文档中查找apply()或call()的示例。)

    我在Chrome的开发者控制台中尝试了第一个示例,它按照您的预期显示了对象。也许这是Firebug中的一个bug?请记住,控制台可能会在一些事情上撒谎。例如,使用
    delete
    删除变量。在控制台中工作,而不是在外面。@Jeremy不,它不工作。它显示“未定义”。Chrome显示对象,但这是因为Chrome显示对象,而不是因为“console.info”功能。在对象下面看,你会发现未定义的单词。@Omar,你错了。在
    obj.bind中写出来之前,在
    this
    中附加一些字符串,以便自己确认这一点。我认为它显示的
    undefined
    obj.bind()
    调用的返回值。除了在ES5严格模式下,如果这不能解析为对象,则保持原样,它不会像其他模式那样设置为全局对象(ES5§10.4.3)。有人想解释下一票吗?我当然不知道出了什么问题,但如果有什么问题,我想解决它。
    var obj = {
      x: 1,
      increment: function() {
        this.x = this.x + 1;
    };
    
    obj.increment(); // Makes "this" be obj
    
    function someFunc(a, b) {
         return a + b; // If you were to refer to "this" here, it would be the global env.
    }
    
    someFunc(5, 6);
    
    function SomeConstructor() {
       this.x = 42; // under the hood, a new object was instantiated for you, and "this" was set to it.
    }
    
    var result = new SomeConstructor(); // note the "new" keyword