我正在讨论关于强类型和静态类型语言的基本争论。另一位辩手是一位纯粹的 JavaScript 爱好者。虽然我喜欢使用 c# 和 javascript。这次对话是关于 TypeScript 以及它如何比纯 js 更好(因为它是强类型的)的讨论。 (已经是主观的)。因此,我向他提供了一个论点,即 TypeScript 在尝试执行以下示例时已经失败了。
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
var greeter = new Greeter("world");
var greetWorld = greeter.greet;
alert(greetWorld()); //undefined, unexpected for strongly typed languages
我已经说过这是 JS 中所期望的。事实上,我喜欢这个。这就是为什么它作为动态类型语言如此强大。但是,“this”关键字只不过是 JS 中的一个属性,这也是为什么 TypeScript 只是一个额外的层,增加了困惑,并没有让它变得更好。
“创建函数时,会(在幕后)创建一个名为 this 的关键字,该关键字链接到函数运行的对象。”(JS)。
那么这确实只是函数/对象的一个属性。强类型的定义:“每种类型的数据(例如整数、字符、十六进制、压缩十进制等)都被预定义为编程语言的一部分,并且为给定程序定义的所有常量或变量都必须用一个来描述数据类型。”因此数据类型函数/对象是独立的,数据类型的关键字“ONE”。
我似乎无法把这个论点解释清楚。事实上,我什至可能是错的。但对我来说,上面的问题是一个运行时类型错误,即使“this”关键字确实绑定(bind)在编程语言中,但它们也没有问候语。
我错过了什么吗?
最佳答案
在 JavaScript 中,关键字 this
指的是当前调用上下文,而不是当前实例 在 C# 中。
在以下几行中:
var greetWorld = greeter.greet;
greetWorld(); //returns "Hello, " + Window.greeting
您正在使用 Window
上下文调用 greetWorld()
,因此 this
将引用 Windows
对象。
如果您想模拟 C# 行为,您必须将您的问候语的对象上下文绑定(bind)到该函数:
var greetWorld = greeter.greet.bind(greeter);
greetWorld(); //returns "Hello, " + greeter.greeting
或者:
var greetWorld = greeter.greet;
greetWorld.bind(greeter)();
关于javascript - 从根本上来说,C# 和 Javascript 中的 "this"关键字是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38771291/