我正在学习Javascript,我有读取函数是第一类对象,大多数作者都提到函数可以返回函数(它们是对象)并将它们作为参数传递给其他函数.
我相信它还有很多东西,所以C#中的函数和javascript中的函数有什么区别?
在C#am中,我说权限不是对象(没有方法,属性等),即使使用闭包(使用lambda表达式和委托),它们看起来像javascript中的函数对象一样?
我觉得在C#中使用lambda表达式,对于刚接触语言的人来说,区别变得有点模糊.
大多数作者所说的是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(){} };
Run Code Online (Sandbox Code Playgroud)
要么
//using a function
function MyFunc(){
var name = value;
function nestedFunction(){}
}
var ob2 = new MyFunc();
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,我们使用一个函数来声明对象,在第一种情况下,我们只是使用文字语法来声明它.
要在C#中执行相同的操作,我们必须创建一个新对象作为类:
MyClass ob1 = new MyClass(); //constructor is a member function of the class
public class MyClass {
public MyClass() {
}
public void nestedFunction(){
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在Javascript中我仍然需要定义返回的方法.
好吧,我认为今晚就足够了.
我能想到的一个最大的区别是,在 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'!
Run Code Online (Sandbox Code Playgroud)
尝试用 C# 编写此代码。
或者实际上,不要打扰——这没有任何意义。
为什么?因为从this词汇上来说,这里没有指代任何东西!它的含义动态变化,与 C# 不同,在 C# 中,它的含义仅取决于封闭类,而不取决于调用者实际是谁。
| 归档时间: |
|
| 查看次数: |
10369 次 |
| 最近记录: |