【发布时间】:2010-10-07 04:06:00
【问题描述】:
我是从语言设计的角度来问这个问题的。所以我想知道
-
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 的仇杀,也不是想要开始争论;我只是想更好地理解它。我确实很欣赏“this”可能很有用,但也认识到 it can be confusing... 肯定会让初学者感到困惑,在足够晦涩的情况下也可能让专家感到困惑。
然而,在该语言的其他核心方面似乎可以回避的时代(即 Crockford 和 with 或 new) .那我错过了什么,这使得this 不可或缺?
【问题讨论】:
-
是什么让你觉得“这个”是个错误?
-
@Gamecat:你从来没有尝试过设计类似javascript的语言,是吗?
-
我仍然认为这是有争议的。该语言暗示了一个问题,参见“‘这’多么令人惊奇(如果它令人惊奇的话)”
-
这不是js本身的问题。许多人认为这是一个挑战,即如何在 js 中完成一些事情以弥补“this”的缺点,或者抱怨 js 的设计有多糟糕。我建议人们不要回答,除非他们从语言设计的角度考虑过。
-
我试着让它看起来不那么有争议。我不认为这是作者的意图,但是寻找对语言特征的批判性评估总是有点雷区。 @mike g:如果您不喜欢我的更改,请随时回滚。
标签: javascript language-design