强调:在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。因为this的取值是执行上下文环境的一部分,每次调用函数,都会产生一个新的执行上下文环境。
this的取值分四种情况:
1.构造函数:所谓构造函数就是用来new对象的函数。严格来说,所有的函数都可以new一个对象,但有些函数的定义是为了new一个对象,而有些不是。另外注意,构造函数的函数名第一个字母大写(规则约定),例如:Object,Array,Function等。
function Foo(){
this.name = 'xx',
this.age = 1988
console.log(this) //Foo {name:'xx',age:1988}
}
var f1 = new Foo();//new构造函数时this取值为它即将new出来的对象
function Foo() {
this.name = 'xx',
this.age = 1988,
console.log(this) //Window
}
Foo() //直接调用构造函数的时候this取值为window
在构造函数的prototype中,this代表什么??
function Fn() {
this.name = 'xx';
this.year = 1988
}
Fn.prototype.getName = function(){
console.log(this.name);
}
var f1 = new Fn();
f1.getName(); //xx
在Fn.prototype.getName函数中,this执行的是f1对象。因此可以通过this.name获取f1.name的值
其实,不仅仅是构造函数的prototype,即便是在整个原型链中,this代表的也都是当前对象的值。
2.函数作为对象的一个属性
如果函数作为对象的一个属性,并且作为对象的一个属性被调用时,函数中的this指向该对象。
var obj = {
x:10;
fn:function() {
console.log(this); //Object(x:10,fn:function);
console.log(this.x) //10
}
}
obj.fn() //调用时this才取值
如果fn函数不作为obj的一个属性被调用,
var obj = {
x:10;
fn:function(){
console.log(this) //window
console.log(this.x) //undefined
}
}
var fn1 = obj.fn;
fn1() //调用时this开始取值。
如果fn函数被复制到另一个变量中,并没有作为obj的一个属性被调用,那么this的值就是window。
3.函数用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才取值
4.全局或者调用普通函数
在全局环境下,this永远是window
普通函数在调用时,this也是window
var x = 10;
var fn = function(){
console.log(this) //window
console.log(this.x) //10
}
fn();
var obj = {
x:10,
fn:function(){
function f(){
console.log(this) //window
console.log(this.x) //undefined
}
f();
}
}
obj.fn() //调用时this开始取值
虽然函数f是在obj.fn内部定义的,但是它仍然是一个普通函数,this指向window。
网友评论