方法中的this
通常,对象方法需要访问对象中存储的信息才能完成其工作。
例如,user.sayHi()
中的代码可能需要用到 user
的 name 属性。
为了访问该对象,方法中可以使用 this
关键字。
this
的值就是在点之前的这个对象,即调用该方法的对象。
在 JavaScript 中,this
关键字与其他大多数编程语言中的不同。JavaScript 中的 this
可以用于任何函数,即使它不是对象的方法。
下面这样的代码没有语法错误:
function sayHi() {
alert( this.name );
}
this
的值是在代码运行时计算出来的,它取决于代码上下文。
我们甚至可以在没有对象的情况下调用函数:
function sayHi() {
alert(this);
}
sayHi(); // undefined
在这种情况下,严格模式下的 this
值为 undefined
。如果我们尝试访问 this.name
,将会报错。
在非严格模式的情况下,this
将会是 全局对象(浏览器中的 windows)
。这是一个历史行为,"use strict"
已经将其修复了。
如果你经常使用其他的编程语言,那么你可能已经习惯了“绑定 this
”的概念,即在对象中定义的方法总是有指向该对象的 this
。
在 JavaScript 中,this
是“自由”的,它的值是在调用时计算出来的,它的值并不取决于方法声明的位置,而是取决于在“点符号前”的是什么对象。
在运行时对 this
求值的这个概念既有优点也有缺点。一方面,函数可以被重用于不同的对象。另一方面,更大的灵活性造成了更大的出错的可能。
箭头函数有些特别:它们没有自己的 this
。如果我们在这样的函数中引用 this
,this
值取决于外部“正常的”函数。
举个例子,这里的 arrow()
使用的 this
来自于外部的 user.sayHi()
方法:
let user = {
firstName: "Ilya",
sayHi() {
let arrow = () => alert(this.firstName);
arrow();
}
};
user.sayHi(); // Ilya
这是箭头函数的一个特性,当我们并不想要一个独立的 this
,反而想从外部上下文中获取时,它很有用
当一个对象变量被复制 —— 引用则被复制,而该对象并没有被复制。
例如:
let user = { name: "John" };
let admin = user; // 复制引用
现在我们有了两个变量,它们保存的都是对同一个对象的引用: