5

私はJavascriptを学んでおり、関数はファーストクラスのオブジェクトであり、ほとんどの作成者は、関数が関数(オブジェクト)を返し、それらをパラメーターとして他の関数に渡すことができると述べています。

それにはもっとたくさんあると確信しているので、C#の関数とjavascriptの関数の違いは何ですか?

C#では、クロージャ(ラムダ式とデリゲートを使用)を使用すると、JavaScriptのように関数オブジェクトのように動作するように見えますが、関数はオブジェクトではないと言うのは正しいですか(メソッド、プロパティなどはありません)?

C#のラムダ式を使用すると、その言語に来たばかりの人にとっては、区別が少し曖昧になると思います。

4

5 に答える 5

7

ほとんどの著者は、javascript では「関数は第一級市民である」と言っています。これらは、クラスに関連付けられた単なるメソッドであるという点で、C# のファースト クラスではありません。メソッド デリゲート (およびラムダ) は、ファースト クラス シチズンのようなメソッドを作成するための特定のクラスです。

Crockford の "Javascript: The Good Parts" や、Skeet や誰かのような著書に戻って読むように言わずに、私が説明できる限りのことを以下に示します。

Javascript は、C# よりもパーツがはるかに少ないです。C# で直接できることと、Javascript でできる (またはできない) こと (およびその逆) を比較しないでください。

では、すべての言語 (または少なくとも C#) に「ファースト クラス関数」がないのはなぜでしょうか? 通常、答えは最も単純です。それは、言語設計の要件ではなかったからです。しかし、明らかに彼らは今それを追加したので、それは私の側では一種の警官です. しかし、誰もあなたの将来の言語にそれを含めるように言わなかったとしたら、あなたはそうしますか?

したがって、覚えておくべき重要なことは、C# では関数 (メソッド) をクラスに関連付ける必要があるということです。Javascript ではそうではありません。その理由は言語定義 (仕様) にあります。

また、オブジェクトの作成に関する声明でこれをフォローアップする必要があります。

次の 2 つの方法のいずれかで、JavaScript で新しいオブジェクトを作成できます。

//using object syntax
var ob1 = { name: value, nestedFunction: function(){} };

また

//using a function
function MyFunc(){
  var name = value;
  function nestedFunction(){}
}
var ob2 = new MyFunc();

2 番目のケースでは、関数を使用してオブジェクトを宣言しています。最初のケースでは、リテラル構文を使用して宣言しています。

C# で同じことを行うには、新しいオブジェクトをクラスとして作成する必要があります。

MyClass ob1 = new MyClass(); //constructor is a member function of the class
public class MyClass {
  public MyClass() {
  }
  public void nestedFunction(){
  }
}

Javascript では、返されるメソッドを定義する必要があったことに注意してください。

わかりました、今夜はこれで十分だと思います。

于 2012-06-16T06:59:24.980 に答える
3

Javascript 関数を作成して変数に割り当てることができます。これらは言語の第一級市民であり、C# が適用した構文糖衣よりも柔軟性があります。

C# では、コードを記述するときに

x => x * x

コンパイラは実際の名前付きメソッドを作成し、そのメソッドをdelegate実行可能な にラップします。

デリゲートは、C# が適用するシンタックス シュガーと共に、JavaScript に非常に似た感覚を与えますが、内部で非常に異なることを行っています。

JavaScript では、関数を作成して変数に直接割り当て、他の構造にラップせずに実行してアクションを有効にすることができます。関数は JavaScript の第一級市民です。

于 2012-06-16T07:40:41.483 に答える
1

私が考えることができる最大の違いの1 つは、C# 関数では、変数は レキシカルスコープであるのに対し、Javascript では、動的にスコープされるを除いて、変数はレキシカル スコープであるということです。this

たとえば、Javascript では、次のように言うことができます。

var foo = new Object();
foo.x = 0;
var bar = function() { this.x = 2; };  // first-class function... what's "this"?
foo.baz = bar;   // Now foo has a method called 'baz', which is 'bar'.
foo.baz();
alert(foo.x);   // Displays 2 -- 'this' magically refers to 'foo'!

これを C# で書いてみてください。

または実際には、気にしないでください。意味がありません。

なんで?thisここでは何も参照していないため、字句的に! C# とは異なり、その意味は動的に変化します。C# とは異なり、その意味は、呼び出し元が実際に誰であるかではなく、囲んでいるクラスに依存するだけです。

于 2012-06-16T07:45:57.287 に答える
0

JS と C# の違いについて、いくつか大まかな考えがあります。

1. Js はインタープリター型言語です。つまり、JS が機能するには、ブラウザーに組み込まれた ECMAScript インタープリターが必要です。C# はコンパイル済み言語です。つまり、C# コードは IL としてコンパイルされて機能します。

2,JS は動的型付け言語です。つまり、定義時に変数の型を指定する必要はありません。C# は静的に型付けされた言語であるのに対し、変数の型を正確に指定する必要があります。

3、OOP カプセル化、JS では、関数は一級市民であると多くの人が言います。通常、関数には 2 種類の用途があります。a) 何らかの作業を操作するための単なる関数 b) オブジェクトをインスタンス化できるクラスとコンストラクター。一方、C# では、関数は関数であり、クラス (またはインターフェイス) に属している必要があります。

4、OOp-inheritance JS では、prototype を使用して継承を実現します。一方、C# では厳密にクラスを使用して継承を実現します。

5、JS での OOP ポリモーフィズム、私の知る限り、疑似配列である引数を使用して、関数のオーバーロードを実現し、あざであるポリモーフィズムをシミュレートできます。一方、C# では、ポリモーフィズムが完全に具現化されています。

6, JS には GC がありません。一方、C# には強力な GC があります。

いくつかのアイデアは正しくないかもしれませんが、提案を歓迎します。

于 2014-08-04T23:57:21.357 に答える