C开发人员未能利用的JavaScript特性?
各位堆垛工人 在我上的第一节计算机课上,教授用C++作为教学语言。他强调,需要理解的重要内容是编程的概念,而不仅仅是语言本身 在过去的几年里,我投身于数据库驱动的web开发。起初,我忙于学习使用服务器端编程工具,即ASP.net。我早期的大多数同事都没有使用太多的客户端脚本代码,但我一直在努力学习编写好的客户端脚本 我已经开始认真使用jQuery了 <> p>最新的C++或.NET开发人员在第一次遇到JavaScript时,首先注意到的是,语法与C风格语言非常相似。 有重要的区别。JavaScript使用变量数据类型,允许数组以行方式声明,并使用自己的对象语法和大括号。最重要的是,JavaScript是一种解释性语言,它允许用户使用Web浏览器与“文档对象模型”交互,而浏览器通常将C++编译成本机代码(或有时托管代码)。对这两种语言进行肤浅的比较是愚蠢的 我想问的是,“当我学习编写JavaScript代码时,我的一部分大脑会忍不住认为它像C代码,因为它看起来像C代码。我可能会因此犯什么错误?我可能不会使用该语言的哪些有用功能?”C开发人员未能利用的JavaScript特性?,javascript,c,programming-languages,Javascript,C,Programming Languages,各位堆垛工人 在我上的第一节计算机课上,教授用C++作为教学语言。他强调,需要理解的重要内容是编程的概念,而不仅仅是语言本身 在过去的几年里,我投身于数据库驱动的web开发。起初,我忙于学习使用服务器端编程工具,即ASP.net。我早期的大多数同事都没有使用太多的客户端脚本代码,但我一直在努力学习编写好的客户端脚本 我已经开始认真使用jQuery了 p>最新的C++或.NET开发人员在第一次遇到JavaScript时,首先注意到的是,语法与C风格语言非常相似。 有重要的区别。JavaScrip
更新:我编辑了我的问题标题,因为我的旧标题很明显是模棱两可的:-/这里几乎没有足够的空间,此外,因为至少有一个很好的来源,我只是发布了一个链接: 要了解Javascript的真实(深层概念)基础知识,请观看Douglas Crockford的视频,网址为 他是揭示(在此之前)语言隐藏的巨大力量的最重要人物之一。此外,即使对于编程语言这样一个相对枯燥的话题,他也是一个非常好的演讲者 然而,这些视频不太适合编程初学者,但是您提出的问题对他们来说也不是一个有用的问题,因为任何答案都需要更深入的理解和大量的实践 核心Javascript非常原始。你在编译时会做一些其他语言中的事情,例如,当你的JS程序被加载时,你已经执行了动态地组装对象、“类”等的代码——在初始加载和执行之后,它可以是一个完全不同的软件。在任何其他(旧的)语言中都没有这两个阶段(可以在Ruby中实现,类似的故事,这些现代语言具有某些特性)。因此,比较JS和C/C++是没有帮助的,尤其是当你只看语法leven的东西时,在这种情况下你将一无所获。不过,它可以提供学习的幻觉。看看克罗克福德
一个块范围示例用于这里的另一个答案中的讨论,因为我现在没有其他地方可以放置它(为了方便起见,用函数“foo”包装)。有一种说法是,在Javascript中不能有块作用域。当然,在其他语言中,您使用的语法要熟悉得多,通常只包含{}或有时开始。。。结束。不管怎样,下面的代码正好提供了块范围。是的,它使用了“function”关键字,但仅仅因为你不习惯它并不能改变事实
function foo () {
var a = 1;
(function () {
//THIS IS BLOCK SCOPE
var a = 2;
console.log(a);
})(); //IMPORTANT: the "()" executes it immediately, INLINE
console.log(a);
};
调用foo():
如果有人仍然说“block scope不可能(在JS中)”,他们应该指出上面的例子没有提供的“block scope”应该有什么,除了需要一些习惯之外,并且比在{}或BEGIN…END中包装代码更不美观。
(s)printf
或者类似的东西(=格式化的输入/输出)
C开发人员可能不会(一开始)使用那么多的函数(lambda),除非他们在C中大量使用函数指针。(删除了前面的示例)
我认为造成混淆的第一个原因是JavaScript中缺少块作用域:
下面是一个例子:
if (true) {
var foo = 7;
}
alert(foo);
“7”已发出警报。对于C++程序员来说,不是一个预期的结果。
它主要是在JavaScript中编写过程代码的问题。如果您像C一样编写JavaScript,您将错过两大功能:
原型OOP和第一类函数 原型OOP允许您创建新对象并应用其他语言的许多OOP模式。它与经典的OOP有很大的不同 一篇关于这方面的好文章是 第一类函数允许您将函数作为参数传递,这允许您编写函数代码。仅此一项,您就可以接近LISP、ML或Haskell的强大功能。同样,一篇好文章也很重要 这两件事之所以重要,是因为它们允许您使用OOP范式和功能范式否则,您将永远无法编写过程性JavaScript。JS与C++有何不同:
if (true) {
var foo = 7;
}
alert(foo);
function returnCount() {
var count = 0;
for(i=0;i<arguments.length;i++) {
count++;
alert(arguments[i]);
}
return count;
}
var number = returnCount('alpha','bravo','charlie');
alert(number);
var CustomEvent = function() {
//name of the event
this.eventName = arguments[0];
var mEventName = this.eventName;
//function to call on event fire
var eventAction = null;
//subscribe a function to the event
this.subscribe = function(fn) {
eventAction = fn;
};
//fire the event
this.fire = function(sender, eventArgs) {
this.eventName = eventName2;
if(eventAction != null) {
eventAction(sender, eventArgs);
}
else {
alert('There was no function subscribed to the ' + mEventName + ' event!');
}
};
};