JavaScript真正的this指向原理
JavaScript函数是一个单独的值,它可以在不同的环境(上下文)中执行,同时JavaScript 允许在函数体内部,引用当前环境的其他变量。
为了能够在函数体内部获得当前的运行环境(context)。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。
在JavaScript语言中,this的设计跟内存的数据结构有关。基本数据类型是按值访问的,引用类型存储在内存中。
比如:
var outer={ fn:function(){console.log(this.x)}, x:2 } var x=1; var runFn=outer.fn; outer.fn() //2 runFn() //1
上面的代码中,将一个对象赋值给变量outer,JavaScript引擎会先在内存中生成对象{fu:function(){},x:2},然后把对象的内存地址赋值给变量outer。
也就是说,变量outer 保存的是一个地址。后面如果要读取outer.fn,引擎先从outer拿到内存地址,然后再从该地址读出原始的对象。
然后原始对象根据fn属性值,然而fn的属性值是一个函数,这时JavaScript引擎将函数单独保存在内存中,然后将函数的内存地址赋值给fn属性的 value 属性。
然后获取函数的地址内存地址,outer.fn()函数运行后,其函数内部上下文(context)指向的就是原始对象环境,即his指向outer,返回outer的x属性值。
outer.fn()是通过outer找到fn,所以就是在outer环境执行。一旦var runFn = outer.fn,变量runFn就直接指向函数本身,所以runFn()就变成在全局环境执行。
相关推荐
nmgxzm00 2020-11-10
ifconfig 2020-10-14
hhanbj 2020-11-17
zfszhangyuan 2020-11-16
古叶峰 2020-11-16
一个智障 2020-11-15
jipengx 2020-11-12
81427005 2020-11-11
xixixi 2020-11-11
游走的豚鼠君 2020-11-10
苗疆三刀的随手记 2020-11-10
Web卓不凡 2020-11-03
小飞侠V 2020-11-02
帕尼尼 2020-10-30
爱读书的旅行者 2020-10-26
帕尼尼 2020-10-23
杏仁技术站 2020-10-23
淼寒儿 2020-10-22