关于tm的this指向问题

为啥用this

由于自己比较菜,对为啥要用this的理解就是方便、简洁,可以隐式的传递一个对象的引用,让代码逻辑简洁,方便。

this的指向问题

误解一:this指向函数自身

var a = 1
function test() {
	var a = 2
	console.log(this.a)
}
test()
// 1

如果this指向函数自身,那么应该输出2

误解二:this指向函数

var a = 1
function test () {
	var a = 2
	fun()
}
function fun() {
	console.log(this.a)
}
test()
// 1

如果this可以指向函数,那么应该输出2

this到底指向哪?

首先要知道到this是函数里自带的一个特殊对象,this的指向是在函数执行时所确定的,this既不指向函数自身,也不指向函数。函数在哪调用,this指向哪。看个栗子

var a = 1
function fun () {
	console.log(this.a)
}
fun()
// 1

这里fun函数在全局调用,那么fun的this就指向全局,也就是window对象。

var a = 2
obj = {
	a: 1,
	fun: fun
}
function fun() {
	console.log(this.a)
}
obj.fun()
// 1

上面栗子中,fun在obj中调用,fun中的this指向obj。

var a = 1
function fun () {
	var a = 2
	return fun1
}
function fun1() {
	var a = 3
	console.log(this.a)
}
fun()()
// 1

上面代码中,先执行fun方法,返回fun1方法,接着执行fun1,fun1还是在全局环境中执行,所以,不管你怎么引用或者返回,函数中的this就是那个对象调用函数,this就指向谁!!!

function test() {
	console.log('test',this)
	function fn() {
		console.log('fn', this)
	}
	fn()
}
let obj = {
	test: test
}
obj.test()
// tset: obj
// fn: window

上面代码,test()作为obj的一个属性被obj调用,this指向obj,fn在test()中执行,没人调用它,那他的this就tm指向window。

下面这段代码有什么问题 CKSTime gKSTime; pthread_mutex_t m_lock; CKSTime::CKSTime() { pthread_mutex_init(&m_lock,NULL); pthread_mutex_lock(&m_lock); ReflushTime(); pthread_mutex_unlock(&m_lock); } CKSTime * CKSTime::GetCurrentTime() { static unsigned long lasttick=0; pthread_mutex_lock(&m_lock); unsigned long tick = ::GetTickCount(); if (lasttick==0) lasttick=tick; if (tick==m_LastTick) { pthread_mutex_unlock(&m_lock); return(this); } if (tick>m_LastTick && (tick-lasttick)<10000) { int dtick = tick-m_LastTick+m_MSecond; m_LastTick = tick; m_MSecond = dtick%1000; dtick = dtick/1000+m_Second; m_Second = dtick%60; dtick = dtick/60+m_Minute; m_Minute = dtick%60; dtick = dtick/60+m_Hour; if (dtick<24) { m_Hour = dtick; pthread_mutex_unlock(&m_lock); return(this); } } lasttick=tick; ReflushTime(); pthread_mutex_unlock(&m_lock); return(this); } CKSTime *GetKSTime(void) { return gKSTime.GetCurrentTime(); } CKSTime::~CKSTime() { pthread_mutex_destroy(&m_lock); } void CKSTime::ReflushTime() { pthread_mutex_lock(&m_lock); struct tm klgLocalTime; time_t now; time(&now); memcpy(&klgLocalTime, localtime(&now), sizeof(klgLocalTime)); m_LastTick = ::GetTickCount(); m_Year = klgLocalTime.tm_year + 1900 ; m_Month = klgLocalTime.tm_mon + 1 ; m_Day = klgLocalTime.tm_mday; m_WeekDay = klgLocalTime.tm_wday; m_Hour = klgLocalTime.tm_hour; m_Minute = klgLocalTime.tm_min; m_Second = klgLocalTime.tm_sec; m_MSecond = m_LastTick%1000; pthread_mutex_unlock(&m_lock); } void CKSTime::ReflushTime2(void) { pthread_mutex_lock(&m_lock); ReflushTime(); pthread_mutex_unlock(&m_lock); }
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值