1. 程式人生 > >JS中this的幾種使用情況

JS中this的幾種使用情況

this關鍵字是JavaScript中最複雜的機制之一,它是一個很特別的關鍵字,被自動定義在所有函式的作用域中。
在函式中this到底取何值, 是在函式真正被呼叫執行的時候確定的,函式定義的時候確定不了。因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生一個新的執行上下文環境。

情況一:建構函式

// 如果函式作為建構函式用,那麼其中的this就代表它即將new出來的物件
function Foo(){
	this.name='star';
	this.year='1994';
	console.log(this);//Foo {name: "star", year: "1994"}
}
var f1=new Foo();
console.log(f1.name);//star
console.log(f1.year);//1994
// 如果直接呼叫Foo函式,this是window

情況二:函式作為物件的一個屬性

// 如果函式作為物件的一個屬性時,並且作為物件的一個屬性被呼叫時,函式中的this指向該物件
var obj={
	x:10,
	fn:function(){
		console.log(this);//Object {x: 10, fn: function}
		console.log(this.x);//10
	}
}
obj.fn();
// 如果fn函式被賦值到另一個變數中,並沒有作為obj的一個屬性被呼叫,那麼this的值就是window
var obj={
	x:10,
	fn:function(){
		console.log(this);//window
		console.log(this.x);//undefined
	}
}
var fn1=obj.fn;
fn1();

情況三:函式用call或者apply呼叫

// 當一個函式被call或者apply呼叫時,this的值就取傳入的物件的值
var obj={
	x:10
};
var fn=function(){
	console.log(this);//Object {x: 10}
	console.log(this.x);//10
}
fn.call(obj);

情況四:全域性&呼叫普通函式

// 在全域性環境下,this永遠是window
console.log(this===window);//true
// 普通函式在呼叫時,其中的this也都是window
var x=10;
var fn=function(){
	console.log(this);//window
	console.log(this.x);//10
}
fn();
//函式f雖然是在obj.fn內部定義的,但是它仍然是一個普通的函式
var obj={
	x:10,
	fn:function(){
		function f(){
			console.log(this);//window
			console.log(this.x);//undefined
		}
		f();
	}
}
obj.fn();

情況五:建構函式在prototype中

/ 在整個原型鏈中,this代表的都是當前物件的值。誰呼叫,this則代表誰。
function Fn(){
	this.name='star';
	this.year='1994';
}
Fn.prototype.getName=function(){
	console.log(this.name);//star
}
var f1=new Fn();
f1.getName();