this的取值
在函數(shù)中this到底取何值守屉,是在函數(shù)真正被調用執(zhí)行的時候確定的慈俯,函數(shù)定義的時候確定不了
1:全局 & 調用普通函數(shù)
console.log(this === window); // true
// 在全局環(huán)境下,this永遠是window
var x = 10;
function foo() {
console.log(this);
console.log(this.x);
}
foo();
// Window {stop: function, open: function, alert: function, confirm: function, prompt: function…}
// 10
var base = {
val: 10,
fn: function() {
console.log('fn', this);
console.log('fn', this.val);
function foo() {
console.log('foo', this);
console.log('foo', this.val);
}
foo();
}
}
base.fn();
// fn Object {val: 10, fn: function}
// fn 10
// foo Window {stop: function, open: function, alert: function, confirm: function, prompt: function…}
// foo undefined
// 函數(shù)foo雖然是在base.fn內部定義的施蜜,但是它仍然是一個普通的函數(shù),this仍然指向window。
2:函數(shù)作為對象的一個屬性
var base = {
val: 20,
foo: function() {
console.log(this);
console.log(this.val);
}
}
base.foo();
// Object {val: 20, foo: function}
// 20
// 結論 :如果函數(shù)作為對象的一個屬性時髓棋,并且作為對象的一個屬性被調用時,函數(shù)中的this指向該對象
var f1 = base.foo;
f1();
// Window {stop: function, open: function, alert: function, confirm: function, prompt: function…}
// undefined
// 結論 :如果fn函數(shù)被賦值到了另一個變量中惶洲,并沒有作為obj的一個屬性被調用按声,那么this的值就是window,this.x為 window.x
3:函數(shù)用call或者apply調用
var base = {
x: 10
}
function foo() {
console.log(this);
console.log(this.x);
}
foo.call(base);
// Object {x: 10}
// 10
// 結論 : 當一個函數(shù)被call和apply調用時恬吕,this的值就取傳入的對象的值签则。
4:構造函數(shù)
function Foo(name, year) {
this.name = name;
this.year = year;
console.log(this);
}
Foo('c.c.', '1992'); // Window {stop: function, open: function, alert: function, confirm: function, prompt: function…}
var fl = new Foo('c.c.', '1992'); // Foo {name: "c.c.", year: "1992"}
// 總結:如果函數(shù)作為構造函數(shù)用,那么其中的this就代表它即將new出來的對象