我是从语言设计的 Angular 问这个问题。所以我想找出答案
this
行为的基本原理是什么?this
的行为在多大程度上是错误的,或者可以改进的?
为了阐明为什么我对 this
感到不安,请考虑以下示例:
var a = {};
a.f = function(){ return this; }
var f = a.f;
// f() != a.f()
请注意 f()
所属的对象是多么容易丢失:从 a
中分离出来,this
成为全局对象(window
用于浏览器)。
现在考虑:
var newA = function(){
var self = {};
self.f = function(){ return self; }
return self;
}
var a = newA();
var f = a.f;
// f() == a.f() !
根本不使用this
,我们就可以建立和维护对象上下文,而不管该方法在何处或如何使用。我忍不住想,有了闭包提供的力量,this
变得多余,甚至可能有点危险......
我不是要针对this
进行报复,也不是要开始争论;我只是想更好地理解它。我很欣赏“这个”可能有用,但认识到 it can be confusing以及......当然会让初学者感到困惑,并且在足够晦涩的情况下可能也会让专家感到困惑。
然而,它仍然是该语言中被大量使用且似乎备受尊重的部分,而在这个语言的其他核心方面似乎可以回避的时代(即 Crockford 和 with
或 新
)。那么我错过了什么,这使得 this
不可或缺?
最佳答案
您似乎期望 this 的行为与它在某些 OO 语言中的行为相同,在某些 OO 语言中它总是引用方法所属的对象。
但是在 JavaScript 中,函数 可以附加到多个对象,或者根本没有对象。在您的示例中,您编写了一个旨在用于一个特定对象的上下文中的函数...但是没有什么能阻止我采用该函数并将其附加到任何其他对象。这就是语言的本质——函数是一流的,对象成员资格是可选的。
因此,this 指的是调用函数的上下文。现在,它可以是任意对象(通过 .
、.apply
或 .call()
指定)或全局对象。在该语言的 future 版本中,它将引用定义函数的上下文:全局函数的全局对象,内部函数的外部 this
;您可以将其视为对设计缺陷的更正,因为在实践中能够使用 this 来引用全局对象并不是特别有用。
关于javascript - JavaScript 中 'this' 关键字行为的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/541167/