JavaScript这个关键字是如何工作的?
我一直在做一些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
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