2016-08-04 4 views
-1

強く型付けされた静的型付き言語については、根本的な議論になりつつあります。他の討論者は、純粋なJavaScriptの愛好家です。私はC#とjavascriptの両方で作業するのが好きです。会話は、TypeScriptに関する議論と、厳密に型指定されているために純粋なjよりも優れていることから生じました。 (すでに主観的)。だから私は彼に次の例でしようとしているところでTypeScriptが既に失敗しているという議論をしました。基本的にC#とJavascriptの "this"キーワードが同じになることができます

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というキーワードが作成されます(舞台裏で)。

これは本当に関数/オブジェクトの単なるプロパティです。厳密に型定義された定義:「各タイプのデータ(整数、文字、16進数、パック10進数など)はプログラミング言語の一部として事前定義されており、与えられたプログラムに定義されたすべての定数または変数は、データ型の "したがって、データ型関数/オブジェクトは、データ型のキーワード "ONE"とは別個です。

私は議論を家に持ち込むことはできません。実際、私は間違っているかもしれません。しかし、私の場合、上記の問題は実行時の型エラーです。つまり、 'this'キーワードが本当にプログラミング言語でバインドされていれば期待されるはずですが、greetingではありません。

何か不足していますか?

+1

ます場合、私は知りません何かが欠落していますが、私はあなたの意見が不足していることを恐れています。質問はなんですか?しかし、私があなたに伝えることの1つは、誰かがあなたが彼に何を話しているか把握できない場合、あなたの少なくとも1人が遅れているか、聞きたくないということです。そしてそれはあなたの損失を減らし、手を振って、あなたが遅滞していないことを確認するためにいくつかの宿題をする時が来たことを意味します。 –

+3

私は、TypeScriptが強く型付けされた言語のすべての動作を複製することができないという理由で、JavaScriptよりも「それほど優れていません」と言っても過言ではないと思います。 – user1620220

答えて

0

C#では、このキーワードは任意のクラスメソッド内で使用でき、メソッドを呼び出すために使用された現在のオブジェクトを参照します。私がJavaScriptを書くのを始めたとき、私はそれが同じだろうと思っていましたが、すぐに間違っていることがわかりました。これはJavaScriptの動作が異なります。

JavaScriptでこのLink

1

をチェックし、キーワードthisは、C#で現在のインスタンスとは反対に、コンテキスト呼び出して、現在のを指します。次の行で

:あなたはWindowコンテキストを使用してgreetWorld()を呼び出している

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

、そうthisWindowsオブジェクトを参照します。

あなたはバインド機能へのあなたのグリーターのオブジェクトコンテキストにあなたが持っていると思いますC#の動作をシミュレートしたい場合:

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

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

ポイントはです。すばらしいです。 .bindを使用することができます。それはない場合、それは未定義です。しかし、それは強く型付けされていません。予期しない動作が発生し、ランタイムTYPEエラーが発生しました。私は狂った薬を服用していますか?私はこれがどう機能するのか理解しています –

+0

@ChrisClark予期せぬことではありません。それが言語の仕組みです。 'greeting'プロパティが現在のコンテキストに存在するかどうかに応じて、実行時エラーが発生することがあります。あなたが 'Window.greeting =" Matt "'を持っていたら、あなたの例は 'Hello、Matt'に警告します –

+0

それは文字通りタイプエラーの定義です。あなたはJSでどのように 'this'が動作するかを説明しようとしているだけなので、downvotedになっています。接続には対処しません。静的な型/強い型の間など –

関連する問題