聊聊this

this的四种调用方式

1.普通函数来调用
2.作为对象的方法来调用
3.函数作为构造函数调用时
4.函数通过call,apply调用时

总结:this取什么值,是在函数执行的时候确认的,而不是定义的时候确认的。

第一种

1.普通函数来调用

this的值指向->window
准确的说this为null,但被解释为window
在ECMAscript5标准中,如果this为null,则被解释为undefined。
在ES6的箭头函数中的this取的是上级作用域的this的值

console.log(window.x); //undefined
function t(){
	this.x=333;
}
t();
console.log(window.x); // 333

第二种

2.作为对象的方法来调用

this指向方法的调用者,即母体对象。

var obj={
	xx: 999,
	yy: 888,
	t: function(){
		console.log(this.xx);
	}
}

obj.t(); // 999

var dog = {xx:'wangwang'};
dog.t = obj.t;
dog.t(); // wangwang

show = function(){
	console.log(this.xx);
}
dog.t = show;
dog.t();//wangwang

第三种

3.函数作为构造函数调用时

js中没有类的概念,
创建对象使用构造函数来完成的,
或者直接用json格式{}来写。

function Dog(name,age){
	this.name=name;
	this.age=age;
	this.back=function(){
		alert('This is '+this.name+'!');
	}
}
var dog = new Dog('Huzi',2);
dog.back(); // This is Huzi

new Dog 发生了以下几个步骤:
a:系统创建空对象{},(空对象constructor的属性指向Dog函数,)
b:把函数的this指向该空对象Dog
c:执行该函数
d:返回该对象

下面的代码运行结果返回的是什么?

function Pig(){
	this.age=99;
	return 'abc';
}
var pig = new Pig();
console.log(pig);

答:返回pig对象,
因为函数作为构造函数运行时,
return的值是忽略的,还是返回对象。

第四种

4.函数通过call,apply,bind调用时

语法格式:fun.call(对象,参数1,参数2···参数n);

function t(num){
	alert('我的真实年龄是' + this.age);
	alert('但我一般告诉别人我' + (this.age + num));
}
var humen = {name:'Ke',age:23};
humen.t = t;

//this指向humen,但是humen多了一个方法属性
humen.t(-10);

//接下来,我们不把t赋值给humen的属性,也能把this指向humen。
var wangwu = {name:'wangwu',age:30};

t.call(wangwu,5);

总结

this的指向:
1.普通函数中的this指向全局对象window
2.构造函数内部this指向新创建出来的对象
3.对象方法内的this指向的是调用该方法的对象
4.call,apply,bind可以改变this的指向
5.手写bind函数

练习

name = 'this is window';
var obj = {
	name:'php',
	t:function(){alert(this.name)}
};
var dog = {name:'huzi'};

obj.t(); // 输出什么?

dog.t=obj.t;
dog.t(); // 输出什么?

var tmp = dog.t;
tmp(); // 输出什么?

(dog.t = obj.t)(); // 输出什么?

dog.t.call(obj); // 输出什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值