我正在学习Javascript,读到了函数是一等公民并且大多数作者都提到函数可以返回函数(也就是对象)并将它们作为参数传递给其他函数。
我相信这里面还有很多内容。那么C#中的函数和Javascript中的函数有什么不同呢?
在C#中,我可以说函数不是对象(没有方法、属性等),即使通过闭包(使用lambda表达式和委托),它们看起来像Javascript中的函数对象吗?
我觉得在C#中使用lambda表达式时,对于刚接触这门语言的人来说,这种区别变得有点模糊了。
我正在学习Javascript,读到了函数是一等公民并且大多数作者都提到函数可以返回函数(也就是对象)并将它们作为参数传递给其他函数。
我相信这里面还有很多内容。那么C#中的函数和Javascript中的函数有什么不同呢?
在C#中,我可以说函数不是对象(没有方法、属性等),即使通过闭包(使用lambda表达式和委托),它们看起来像Javascript中的函数对象吗?
我觉得在C#中使用lambda表达式时,对于刚接触这门语言的人来说,这种区别变得有点模糊了。
记住的关键是:在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();
MyClass ob1 = new MyClass(); //constructor is a member function of the class
public class MyClass {
public MyClass() {
}
public void nestedFunction(){
}
}
Predicate<int> pred = i => i % 2 == 0;
对我来说看起来确实像是一等公民函数... 只不过类型没有被推断出来罢了。但这也并没有什么区别... - user541686function(){ ... }
:p 请注意,您可以在JavaScript中使用嵌套函数,因为它们是一等公民。 - jcolebrandfunction(){}
。 - jcolebrand我能想到的最大不同点就是在C#函数中,变量是在词法作用域下的,而在Javascript中,变量除了this
以外都是在词法作用域下的,而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#中,它的含义仅取决于封闭类,而不是调用者本身。
this
关键字不是自由变量。它有特殊规则。请参见以下问题。 - Aadit M Shahthis
在JS中是动态作用域,其他变量是静态作用域。我也不知道你在这里所说的自由变量与绑定变量的区别,因为除了this
之外,我没有看到任何“自由”变量,而我已经提到了它是动态的。 - user541686我对JS和C#之间的区别有一些初步的想法:
1、JS是一种解释性语言,这意味着JS需要一个内置的ECMAScript解释器才能工作。而C#是一种编译型语言,这意味着C#代码将被编译为IL以便工作。
2、JS是一种动态类型语言,这意味着在定义变量时不需要指定变量类型。而C#是一种静态类型语言,这意味着需要指定变量的确切类型。
3、面向对象封装,在JS中,很多人说函数是第一类公民。通常,函数有两种用途:a)只是一个用于操作某些工作的函数;b)类和构造函数,使用它们可以实例化对象。而在C#中,函数是函数,应该属于类(或接口)。
4、面向对象继承,在JS中,我们使用原型来实现继承。而在C#中,我们严格使用类来实现继承。
5、面向对象多态,在JS中,根据我的了解,我们可以使用伪数组arguments来实现函数重载以模拟多态,这是一种折衷方案。而对于C#,多态性得到了完美体现。
6、在JS中,我们没有垃圾回收机制。而对于C#来说,有一个强大的垃圾回收机制。
也许有些想法不正确,欢迎提出建议。
为了澄清一些混淆的问题;
1) JavaScript确实是一种编译语言。代码在浏览器执行之前会被编译,而且速度很快!这就是为什么一些开发人员认为它是一种“解释性”语言。
2) C#没有JS中的函数,它有类方法。