javascript - JavaScript 中 'this' 关键字行为的基本原理是什么?

标签 javascript language-design

我是从语言设计的 Angular 问这个问题。所以我想找出答案

  1. this 行为的基本原理是什么?
  2. 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/

相关文章:

c# - 为什么 IEnumerable<T> 在 C# 4 中是协变的?

java - 为什么 Java 允许接口(interface)具有静态只读字段而 .NET 接口(interface)不能?

groovy - 为什么仅在不需要返回值时才在 Groovy 中使用括号是可选的?

javascript - 提交表单或模拟按下 Enter/Return

javascript - AngularJS 中 $http 的错误处理程序

javascript - td 标签内有条件执行 php 脚本

javascript - Titanium.Network.online 无法在 Android 模拟器上运行

python - 为什么 Python 列表实现为动态数组而不是环形缓冲区?

javascript - 用于 ECMAScript 的 EBNF?

lua - 有人可以解释一下 Lua 的解释器,为什么它这么快?