【问题标题】:Fundamentally, can the "this" keyword be the same in C# vs Javascript从根本上说,“this”关键字在 C# 与 Javascript 中是否相同?
【发布时间】:2016-12-10 19:26:32
【问题描述】:

我正在讨论关于强类型和静态类型语言的基本论点。另一位辩论者是纯粹的 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”。

我似乎无法将争论带回家。事实上,我什至可能是错的。不过对我来说,上面的问题是一个运行时类型错误,它们不是greeting,即使如果“this”关键字真正绑定在编程语言中,也是可以预料的。

我错过了什么吗?

【问题讨论】:

  • 我不知道你是否遗漏了什么,但我担心我错过了你的意思。问题是什么?不过,我可以告诉你一件事:如果有人一直无法理解你告诉他的内容,那么至少你们中的一个人要么是智障,要么不愿意听。这意味着是时候减少你的损失,握手,做一些功课,以确保你不是智障。
  • 我认为仅仅因为 TypeScript 不能复制强类型语言的所有行为,就说它“不比 JavaScript 更好”是不公平的。

标签: javascript c# strong-typing


【解决方案1】:

在 JavaScript 中,关键字this 指的是当前调用上下文,而不是当前实例强> 在 C# 中。

在以下几行中:

var greetWorld = greeter.greet;
greetWorld(); //returns "Hello, " + Window.greeting

您正在使用Window 上下文调用greetWorld(),因此this 将引用Windows 对象。

如果你想模拟 C# 行为,你必须将你的欢迎者的对象上下文绑定到函数:

var greetWorld = greeter.greet.bind(greeter);
greetWorld(); //returns "Hello, " + greeter.greeting

或者:

var greetWorld = greeter.greet;
greetWorld.bind(greeter)();

【讨论】:

  • 重点是。伟大的。您可以使用 .bind。太好了,如果没有,它是未定义的。但这使得它不是强类型的。存在意外行为,导致运行时 TYPE 错误。我在吃疯狂的药吗?我明白这是怎么回事。
  • @ChrisClark 这并不意外。这就是语言的工作方式。您可能会收到运行时错误,具体取决于当前上下文中是否存在 greeting 属性。如果你有Window.greeting = "Matt",那么你的例子会提醒Hello, Matt
  • 这就是类型错误的定义。您之所以被否决,是因为您只是想解释“this”在 JS 中的工作原理。不解决连接问题。在静态类型/强类型等之间。
  • @ChrisClark 但是这并不意外
  • @ChrisClark 所以你对他投了反对票,因为他没有添加一句话说“是的,即使使用 TypeScript,JavaScript 在强类型方面与 C# 不同”?
【解决方案2】:

在 C# 中,this 关键字在任何类方法中都可用,它指的是用于调用该方法的当前对象。当我第一次开始编写 JavaScript 时,我以为它会是一样的,但很快就发现我错了。 JavaScript 中的 this 有不同的行为。

看看这个Link

【讨论】:

    【解决方案3】:

    在 JS 中,所有对象都是引用类型,而函数是对象。这意味着当您在另一个对象中分配对象的方法(函数定义)时,会调用最初定义的方法(它不会被克隆到新对象中)。这也意味着,我们需要根据调用它的人来区分方法中驻留的this

    var o = { name: "A"
            , sing: function(){console.log(this.name)}
            },
        p = { name: "B"
            , sing: o.sing  // we refer to o.sing and the this in o.sing should now become p
            },
        q = { name: "C"};   // does not even have a sing method
    
    o.sing();               // <- A
    p.sing();               // <- B
    o.sing.call(q);         // <- C -- the call function shifts the context of o.sing to q
    

    所以o.call 中的this 会浮动到调用它的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2016-05-16
      相关资源
      最近更新 更多