从根本上说,我们可以;这";关键字在C#vs Javascript中必须相同

从根本上说,我们可以;这";关键字在C#vs Javascript中必须相同,javascript,c#,strong-typing,Javascript,C#,Strong Typing,我正在进入一个关于强类型语言和静态类型语言的基本争论。另一位辩论者是一位纯粹的javascript爱好者。我喜欢同时使用c#和javascript。对话是在讨论TypeScript以及它如何优于纯js(因为它是强类型的)的过程中进行的。(已经是主观的了)。因此,我向他提供了一个论点,即TypeScript在以下示例中尝试执行的操作已经失败 class Greeter { greeting: string; constructor(message: string) {

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

这实际上只是函数/对象的一个属性。强类型的定义:“每种类型的数据(如整数、字符、十六进制、压缩十进制等)都是作为编程语言的一部分预定义的,并且为给定程序定义的所有常量或变量都必须使用其中一种数据类型来描述。”因此数据类型函数/对象是独立的,关键字“一”数据类型的定义

我似乎无法把这场争论说清楚。事实上,我甚至可能是错的。但是,对我来说,上面的问题是一个运行时类型的错误,即他们的问候语是no
greeting
,即使在编程语言中确实绑定了“this”关键字也是应该的

我遗漏了什么吗?

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

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


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

在以下行中:

var greetWorld = greeter.greet;
greetWorld(); //returns "Hello, " + Window.greeting
您正在使用
Window
上下文调用
greetWorld()
,因此
将引用
Windows
对象

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

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

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

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

在以下行中:

var greetWorld = greeter.greet;
greetWorld(); //returns "Hello, " + Window.greeting
您正在使用
Window
上下文调用
greetWorld()
,因此
将引用
Windows
对象

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

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

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

在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
var o={name:“A”
,sing:function(){console.log(this.name)}
},
p={name:“B”
,sing:o.sing//我们指的是o.sing,o.sing中的this现在应该变成p
},
q={name:“C”};//甚至没有唱歌的方法

o、 sing();// 在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
var o={name:“A”
,sing:function(){console.log(this.name)}
},
p={name:“B”
,sing:o.sing//我们指的是o.sing,o.sing中的this现在应该变成p
},
q={name:“C”};//甚至没有唱歌的方法

o、 sing();//我不知道你是否遗漏了什么,但我担心我没有抓住你的重点。问题是什么?不过,有一件事我可以告诉你:如果有人一直听不懂你对他说的话,你们中至少有一个人不是弱智就是不愿意听。这意味着是时候减少你的损失了,握手,做些家庭作业以确保你不是弱智的人。我认为说TypeScript不能复制强类型语言的每一个行为是不公平的,它“并不比JavaScript好”。我不知道你是否遗漏了什么,但我恐怕我没有领会你的意思。问题是什么?不过,有一件事我可以告诉你:如果有人一直听不懂你对他说的话,你们中至少有一个人不是弱智就是不愿意听。这意味着是时候减少你的损失了,握手,做些家庭作业来确保你不是弱智的人。我认为说TypeScript不能复制强类型语言的所有行为,它“并不比JavaScript好”是不公平的。重点是。伟大的你可以使用.bind。太好了,如果不是的话,它是未定义的。但这使得它不是强类型的。存在导致运行时类型错误的意外行为。我在吃疯狂的药片吗?我明白这是怎么回事。@ChrisClark这并不意外。Th