JS中this的幾種使用情況
阿新 • • 發佈:2018-12-03
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();