获得徽章 0
- #划个知识点 一直觉得context这个概念理解起来非常费劲。context基本出现在这样的场景:这里的this指代什么?回答是拥有该函数的context。context的中文翻译是上下文。那么这个回答就是拥有该函数的上下文。
一提到上下文,我就会想到语文老师说的“联系文章的上下文来解读这一段”。但是在JS中,并没有文章的概念。在这个回答里,勉强接近文章这个概念的,似乎就是对象了。那这个回答翻译过来就是:拥有该函数的对象。
这样看上去,this这个概念未免也太好理解了吧。this就是拥有该函数的对象,一目了然,简直不要太简单~但当我们使用bind、call、apply这三个函数重新绑定函数的作用域时,这个理解就是错的。
举个例子,obj1.function1。如果在function1中使用关键词this,那么this指代的是什么?按照上面的理解,this应该指代的是obj1,这是对的。接下来我们使用bind函数对function1进行改造:obj1.function1.bind(obj2)。这里的this指代的是什么呢?按照上面的理解,this应该指代的应该还是obj1,但实际上this指代的是obj2。
从上面的例子可以看出,将this的定义“拥有该函数的context”t翻译为“拥有该函数的对象”不能说完全错误,但显然是不准确的。context就是一个独立的概念,尽管这个概念翻译过来是如此的别扭。
上面还提到了作用域的概念,将context翻译成作用域好不好呢?我们带入this的定义看看:拥有该函数的作用域。将这个概念带入上面的例子,两种情况都能吻合,看上去很完美啊。但作用域这个概念更偏向范围,“拥有该函数的范围”,读起来也觉得怪怪的。
当然还有一种理解,就是我们将bind、call、apply的理解稍微翻译一下。我们将bind、call、apply理解为“更换该函数的拥有者/拥有对象”,那对this的第一种理解“拥有该函数的对象”就很准确了。使用bind函数之前,拥有function1的对象是obj1,因此function1内部的this指代的就是obj1。使用bind函数之后,拥有function1的对象就变成了obj2,因此function1内部的this指代的就是obj2。
总之,我觉得context的中文翻译还是要改~~~~展开29