你不知道的javaScript读书笔记(六)

this全面解析

笔记:

this的运行机制:

(1) this是在运行时绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。
(2) 当一个函数被调用时,会创建一个活动记录(有时候也被称作执行上下文)。这个记录会包含函数在哪里调用(调用栈)、函数的调用方式、传入的参数等信息。this就是记录这个属性,它会在函数执行时候被用到。

查看函数this的方法:

this的绑定就是通过函数的直接调用位置,所以分析函数的直接调用位置,就可以分析出每个执行函数的this。可以把调用栈想象成一个函数的作用链,通过这个作用链可以清晰的看到每个函数的直接调用位置。

代码示例:

function baz(){
     
	//当前调用栈是:baz
	//因此调用位置是全局作用域,this指向window
	
	console.log('baz')
	bar() // <- bar的调用位置
}

function bar(){
     
	//当前调用栈是:baz -> bar
	//因此调用位置是baz中,this指向baz
	
	console.log('bar')
	foo() // <- foo的调用位置
}

function foo(){
     
	//当前调用栈是:baz -> bar -> foo
	//因此调用位置是bar中,this指向bar
	
	console.log('foo')
}

baz() //<- baz的调用位置

找到函数的调用位置以后就可以通过以下四条规则来判断this的绑定对象:

(1)由new调用的话,this绑定到新创建的对象上
(2)由call、apply或者bind调用的话,this绑定在指定的对象上
(3)由上下文调用的话,this绑定到那个上下文对象
(4)默认情况,在严格模式下绑定在undefined,否则绑定到全局对象

new 在执行时会做四件事情:

(1)在内存中创建一个空对象
(2)让this指向这个对象
(3)执行构造函数里面的代码,给这个新对象添加属性和方法
(4)返回这个新对象(所以构造函数里面不需要return)

注意:箭头函数不会遵循四条标准的绑定规则,它不会创建自己的this上下文,会继承定义时外层函数的this绑定(无论this绑定到什么),并且不会被改变。

你不知道的javaScript读书笔记(六)_第1张图片

你可能感兴趣的:(笔记,javascript)