一、JavaScript——this原理,内存的数据结构
2019-08-12 本文已影响3人
陈程城
问题:为什么函数中的this指向调用这个函数的对象?
var obj = {
a:'obj里的ccc',
b:function(){
console.log(this.a)
}
}
// 1.obj调用b函数
obj.b()
// obj里的ccc
// 2.window 调用b函数
var a = 'window下的ccc'
var c = obj.b
c()
// window下的ccc
为什么执行的结果会有如此的差异呢
为什么obj.b()
是obj
调用了函数
为什么c()
是window
调用了函数
为什么函数内的this,指向调用这个函数的对象(环境)呢
解释:
var a = {haha:'hehe'}
-
一个对象
{haha:'hehe'}
赋值给了 变量a
-
js会在内存中,生成一个对象
{haha:'hehe'}
-
然后把这个对象在内存里的
地址
给到变量a
-
所以
a
拿到的只是一个地址
var obj = {
a: function(){}
}
-
同理
obj
拿到的是{a: function(){}}
对象在内存里的地址 -
而
{a: function(){}}
对象在内存中的a
变量也只是function(){}
在内存中另外的一个地址 -
由于函数是一个单独的值(value)
-
所以函数可以在不同的环境(对象)执行
-
this也指向了不同的环境
所以 问题中的obj.a
和c
存放的是同一个函数在内存中的地址----a、c变量中存的都只是地址
所以 obj.a()
和c()
是同一个函数,在不同环境中执行
那么this
就指向不同的环境
总结:
所以才有,那么那么多的,函数中的this,是指向调用该函数的环境(对象),这样一些类似的概念