C开发人员未能利用的JavaScript特性?

C开发人员未能利用的JavaScript特性?,javascript,c,programming-languages,Javascript,C,Programming Languages,各位堆垛工人 在我上的第一节计算机课上,教授用C++作为教学语言。他强调,需要理解的重要内容是编程的概念,而不仅仅是语言本身 在过去的几年里,我投身于数据库驱动的web开发。起初,我忙于学习使用服务器端编程工具,即ASP.net。我早期的大多数同事都没有使用太多的客户端脚本代码,但我一直在努力学习编写好的客户端脚本 我已经开始认真使用jQuery了 p>最新的C++或.NET开发人员在第一次遇到JavaScript时,首先注意到的是,语法与C风格语言非常相似。 有重要的区别。JavaScrip

各位堆垛工人

在我上的第一节计算机课上,教授用C++作为教学语言。他强调,需要理解的重要内容是编程的概念,而不仅仅是语言本身

在过去的几年里,我投身于数据库驱动的web开发。起初,我忙于学习使用服务器端编程工具,即ASP.net。我早期的大多数同事都没有使用太多的客户端脚本代码,但我一直在努力学习编写好的客户端脚本

我已经开始认真使用jQuery了

<> p>最新的C++或.NET开发人员在第一次遇到JavaScript时,首先注意到的是,语法与C风格语言非常相似。 有重要的区别。JavaScript使用变量数据类型,允许数组以行方式声明,并使用自己的对象语法和大括号。最重要的是,JavaScript是一种解释性语言,它允许用户使用Web浏览器与“文档对象模型”交互,而浏览器通常将C++编译成本机代码(或有时托管代码)。对这两种语言进行肤浅的比较是愚蠢的

我想问的是,“当我学习编写JavaScript代码时,我的一部分大脑会忍不住认为它像C代码,因为它看起来像C代码。我可能会因此犯什么错误?我可能不会使用该语言的哪些有用功能?”


更新:我编辑了我的问题标题,因为我的旧标题很明显是模棱两可的:-/

这里几乎没有足够的空间,此外,因为至少有一个很好的来源,我只是发布了一个链接:

要了解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中包装代码更不美观。

  • 闭包
  • 匿名内联对象
  • 动态类型
  • 垃圾收集
  • 动态数组和对象
  • 但是,来自C语言的人可能不会真正“错过”这些特性。。。人们可以很高兴地将javascript用作C(当然,这样做会损失很多,也会给那些真正懂javascript的程序员带来一场真正的噩梦,如果他们必须在同一个项目上工作的话)。

    我一直怀念的是:

    (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++有何不同:

  • 动态类型
  • 函数式编程(导致嵌套函数、范围链和 (关闭)
  • 无类OOP与原型继承
  • 无块范围
  • 解释语言
  • 脚本语言(因此dep
    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!');
            }
        };
    };