C开发人员无法利用的JavaScript功能?

时间:2011-05-11 19:29:14

标签: javascript c programming-languages

Fellow Stackers,

在我参加的第一个计算机科学课上,教授使用C ++作为教学语言。他强调要理解的重要事项是编程的概念,而不仅仅是语言本身。

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

我已经开始认真使用jQuery了。

大多数C ++或.net开发人员在第一次遇到JavaScript时会注意到的第一件事就是它的语法与C风格的语言非常相似。

存在重要差异。 JavaScript使用变量数据类型,允许数组在线声明,并使用它自己的对象语法和花括号。最重要的是,JavaScript是一种解释性语言,允许用户使用Web浏览器与“文档 - 对象 - 模型”进行交互,C ++通常被编译为本机代码(或有时是托管代码)。如果不仅仅是对两种语言进行肤浅的比较,那将是愚蠢的。

我想问的是,“当我学习编写JavaScript代码时,我的一部分思绪不禁将其视为C代码,因为它看起来像C代码。我可能犯的错误是什么由于这个原因,我可能没有使用该语言的哪些有用功能?“

更新:我编辑了我的问题标题,因为很清楚我的旧标题含糊不清: - /

9 个答案:

答案 0 :(得分:7)

此处没有足够的空间,此外,因为至少有一个很棒的来源我只是发布一个链接:

要了解Javascript的真实(深层概念)基础知识,请观看Douglas Crockford在http://developer.yahoo.com/yui/theater/

的视频

他是最重要的人物之一(在那之前)隐藏了该语言的强大力量。此外,即使对于编程语言这样一个相对干燥的话题,他也是一位非常优秀的主持人。

然而,这些视频并不适合初学者编程,但是你提出的问题对他们来说并不是一个有用的问题,因为任何答案都需要更深刻的理解和相当多的练习。

核心Javascript非常好。你做其他语言在编译时发生的事情,例如,当你的JS程序被加载时你已经执行了动态组装对象,“类”等的代码 - 并且在初始加载和执行之后它可以是一个完全不同的部分软件你没有任何其他(旧)语言的这两个阶段(你可以用Ruby做,类似的故事,那些现代语言共享某些功能)。因此,比较JS和C / C ++没有任何帮助,尤其是当你只看到语法leven的东西时,在这种情况下你根本就什么也学不到。但它可以提供学习的幻觉。看着克罗克福德。


一个块范围示例,在这里的另一个答案中讨论,因为我现在没有其他地方可以放置它(为了方便包装在函数“foo”中)。有一种说法,你不能在Javascript中拥有块范围。当然,在其他语言中,您使用更熟悉的语法,通常只包含{}或有时BEGIN ... END。无论如何,下面提供了完全的块范围。是的,它使用“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():

2
1

如果有人仍然说“块范围是不可能的(在JS中)”,他们应该指出上面的例子没有提供的“块范围”,除了需要一些习惯并且不太美观之外包裹代码{}或BEGIN ... END。

答案 1 :(得分:6)

我会说

  1. 闭包
  2. 无名内联对象
  3. 动态类型
  4. 垃圾收集
  5. 动态数组和对象
  6. 但是来自C的某人可能实际上并没有“错过”这些功能...人们可以愉快地使用javascript作为C(当然失去很多这样做也为同伴创造了一个真正的噩梦程序员实际上知道javascript,如果他们必须在同一个项目上工作)。

答案 2 :(得分:4)

删除上一个示例

我认为造成混淆的首要原因是在JavaScript中缺少阻止范围

以下是一个例子:

if (true) {
    var foo = 7;
}
alert(foo);

" 7"警报。不是C ++程序员的预期结果。

答案 3 :(得分:2)

主要是在JavaScript中编写过程代码的问题。如果你编写像C:

这样的JavaScript,你会错过两个重要的功能

原型OOP 一流功能

Prototypical OOP允许您创建新对象并应用其他语言的许多OOP模式。它与传统的OOP有很大的不同。

关于此的好文章将是JavaScript Garden Objects section

第一类函数允许您将函数作为参数传递,这允许您编写功能代码。只有这一点,你才能接近LISP,ML或Haskell的力量。同样好的文章是JavaScript Garden Functions section

这两件事很重要的原因是因为它们允许您使用 OOP范例功能范例

否则你将永远陷入编写程序JavaScript的困境。

答案 4 :(得分:1)

JS与C ++的不同之处:

  1. 动态打字
  2. 功能编程(导致嵌套函数,范围链和 封)
  3. 无类OOP和原型继承
  4. 没有阻止范围
  5. 口译语言
  6. 脚本语言(因此取决于环境)
  7. 事实上,我写了几篇关于JavaScript的教程,强调了这些相同的观点。您可以在my blog

    上阅读

答案 5 :(得分:0)

我一直想念:

(s)printf

或类似的东西(=格式化的输入/输出)。

C开发人员可能不会那么多地使用(起初):函数(lambdas),除非他们在C中大量使用函数指针。

答案 6 :(得分:0)

以下是我最近了解到的一个示例:arguments变量。此变量可以在任何函数中使用,以访问作为数组传递给函数的参数。

当我第一次知道你可以用x参数声明一个函数并用y参数(x!= y)调用它时,我觉得它很糟糕。我认为做这样的事情会产生错误;考虑将Javascript代码视为C代码的结果。

arguments变量允许您使用可能接收任意数量变量的函数。请考虑以下示例:

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);

当使用'alpha','bravo'和'charlie'调用returnCount时,它将使用所有三个值进行警报,然后返回数字3。每天都学到新的东西!

答案 7 :(得分:0)

我发现Douglas Crockford非常有用。除了上一个答案中提到的视频外,Crockford还有一个网站,其中包含非常好的信息:http://javascript.crockford.com/

我想添加一些我已经了解到C开发人员可能会错过的新内容:少量原始数据类型严格相等运算符(===)

对于原始数据类型,Javascript只有布尔字符串数字

当然,C有布尔和字符串(C字符串,yada yada yada ...),但C有许多不同类型的数字基元:16位整数,32位整数,32位字节浮点数, 48位浮点数等。 Javascript只有64位浮点数,IEEE 754双精度浮点数。

不幸的是,这对算术来说很奇怪,例如,由于浮点运算的工作方式,0.1 + 0.2 == 0.3的计算结果为假。

对于严格相等运算符(===),它的工作方式与普通等式运算符类似,但没有类型强制。这意味着3 ==“3”的计算结果为真,但3 ===“3”的计算结果为假。

答案 8 :(得分:0)

这是代码的另一个代码段(不包括以下链接),这使我的C-head成为偏头痛。它允许您为Javascript代码定义自定义事件。

http://www.geekdaily.net/2008/04/02/javascript-defining-and-using-custom-events/

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!');
        }
    };
};