5

我正在学习 Javascript,我读过函数是一流的对象,大多数作者提到函数可以返回函数(它们是对象)并将它们作为参数传递给其他函数。

我确信它还有很多东西,那么 C# 中的函数和 javascript 中的函数之间有什么区别?

在 C# 中,我是否可以正确地说函数不是对象(没有方法、属性等),即使使用闭包(使用 lambda 表达式和委托)它们看起来就像 javascript 中的函数对象一样?

我觉得使用 C# 中的 lambda 表达式,对于刚接触该语言的人来说,区别变得有点模糊。

4

5 回答 5

7

大多数作者所说的是javascript中的“函数是一等公民”。它们不是C# 中的第一类,因为它们只是那里的方法,附加到一个类。方法委托(和 lambdas)是特定的类,目的是使方法一等公民。

所以这就是事情,尽我所能解释它,而不是告诉你回去阅读 Crockford 的“Javascript:The Good Parts”和类似 Skeet 或其他人的东西:

Javascript 的部分比 C# 少得多。不要将您可以在 C# 中直接执行的操作与您可以(或不能)在 Javascript 中执行的操作(反之亦然)进行比较。

那么为什么不是所有的语言(或者至少是 C#)都有“一流的功能”呢?答案通常是最简单的:因为那不是语言设计要求。然而,这对我来说是一种逃避,因为显然他们现在已经添加了它。但是,如果没有人告诉你将它包含在你未来的语言中,你会吗?

所以要记住的关键是:在 C# 中,函数(方法)必须附加到一个类。在Javascript中他们没有。原因在语言定义(规范)中。

此外,我应该在此之后发表关于对象创建的声明:

您可以通过以下两种方式之一在 javascript 中创建新对象:

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

或者

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

在第二种情况下,我们使用函数来声明对象,在第一种情况下,我们只是使用文字语法声明它。

为了在 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可以执行的 a 中。

委托以及 C# 应用的语法糖给人一种与 JavaScript 非常相似的感觉,但它在内部做着非常不同的事情。

在 JavaScript 中,您可以创建一个函数并将其直接分配给一个变量并执行它,而无需将其包装在任何其他结构中以启用该操作。函数是 JavaScript 中的一等公民。

于 2012-06-16T07:40:41.483 回答
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# 中,它的含义仅仅取决于封闭的类,而不是调用者的实际身份。

于 2012-06-16T07:45:57.287 回答
0

关于 JS 和 C# 的区别,我有一些粗略的想法:

1、Js是一种解释型语言,也就是说JS需要浏览器内置的ECMAScript解释器才能工作。而 C# 是一种编译语言,这意味着 C# 代码将被编译为 IL 才能工作。

2,JS是动态类型语言,定义时不需要指定变量的类型。而 C# 是静态类型语言,这意味着您需要指定变量的确切类型。

3、OOP-封装,在JS中,很多人说函数是一等公民。通常,函数有两种用法:a)只是一个操作某些工作的函数 b)类和构造函数,您可以使用它来实例化对象。而在 C# 中,函数就是函数,它应该属于类(或接口)。

4、OOp-inheritance,在JS中,我们使用prototype来实现继承。而在 C# 中,我们严格使用类来实现继承。

5、OOP-polymorphism,在JS中,据我所知,我们可以使用arguments,这是一个伪数组,来实现函数重载来模拟多态,这是一个伤痕累累的事情。而对于 C# 来说,多态性得到了如此完美的体现。

6、在JS中,我们没有GC。而对于 C#,有一个强大的 GC。

可能有些想法不正确,欢迎提出建议。

于 2014-08-04T23:57:21.357 回答
0

只是为了澄清一些混乱;

1) JavaScript 确实是一种编译语言。代码的编译方式就在浏览器上执行之前,而且速度很快!这就是为什么一些开发人员认为它是一种“解释”语言。

2) C# 没有 JS 意义上的函数。它有类方法。

于 2017-10-15T04:20:28.137 回答