跨越边界: JavaScript语言特性

JavaScript 常被人们认为是编程语言中无足轻重的一员。这种观点的形成可以“归功”于 其开发工具、复杂且不一致的面向 HTML 页面的文档对象模型以及不一致的浏览器实现。但 JavaScript 绝对不仅仅是一个玩具这么简单。在本文中,Bruce Tate 向您介绍了 JavaScript 的语言特性。

几乎每个 Web 开发人员都曾有过诅咒 JavaScript 的经历。这个备受争议的语言受累于其复杂的称为 文档对象模型 (DOM)的编程模型、糟糕的实现和调试工具以及不一致的浏览器实现。直到最近,很多开发 人员还认为 Javascript 从最好的方面说是无可避免之灾祸,从最坏的方面说不过是一种玩具罢了。

然而 JavaScript 现在开始日益重要起来,而且成为了广泛应用于 Web 开发的脚本语言。JavaScript 的复苏使一些业界领袖人物也不得不开始重新审视这种编程语言。诸如 Ajax (Asynchronous JavaScript + XML) 这样的编程技术让 Web 网页更加迷人。而完整的 Web 开发框架,比如 Apache Cocoon,则让 JavaScript 的应用越来越多,使其不只限于是一种用于制作 Web 页面的简单脚本。JavaScript 的一种 称为 ActionScript 的派生物也推动了 Macromedia 的 Flash 客户端框架的发展。运行在 JVM 上的实现 Rhino 让 JavaScript 成为了 Java 开发人员所首选的一类脚本语言(参见 参考资料)。

我的好友兼同事 Stuart Halloway 是 Ajax 方面的专家,曾在其教授的 JavaScript 课程中做过这样 的开场白:“到 2011 年,JavaScript 将被公认为是一种拥有开发现代应用程序所需的一整套新特 性的语言” 。他继而介绍说 JavaScript 程序要比类似的 Java 程序紧密十倍,并继续展示了使其 之所以如此的一些语言特性。

在这篇文章中,我将带您探究 JavaScript 的一些特性,看看这些特性如何让它如此具有吸引力:

高阶函数: 一个高阶函数可以将函数作为参数,也可以返回一个函数。此特性让 JavaScript 程序员 可以用 Java 语言所不能提供的方法来操纵函数。

动态类型:通过延迟绑定,JavaScript 可以更准确和更灵活。

灵活的对象模型:JavaScript 的对象模型使用一种相对不常见的方式进行继承 —— 称为 原型 —— 而不是 Java 语言中更常见的基于类的对象模型。

您可能已经熟悉动态类型模型、高阶函数形式的函数式编程以及开放对象模型这些概念,因为我在其 他的跨越边界 系列文章中已经作过相关的介绍。如果您从未进行过任何正式的 JavaScript 开发,您很 可能会认为这些特性属于非常复杂的语言,例如 Python、Lisp、Smalltalk 和 Haskell,而绝非像 JavaScript 这样的语言所能提供的。因此,我将用实际的代码示例来说明这些概念。

立即开始

您无需设置 JavaScript。如果您可以在浏览器中阅读此篇文章,就证明您已经准备就绪了。本文包含 的所有编程示例都可以在大多数浏览器内运行。我使用的是 Firefox。

用在 <script type='text/javascript'> 和 </script> 标记之间所包含的 JavaScript 加载简单的 Web 页面。清单 1 可以显示 Hello, World 文本:

清单 1. Hello, world

<script type='text/javascript'>
alert('Hello, World.')
</script>

要运行此代码,只需创建一个名为 example1.html 的文件。将清单 1 的代码复制到该文件内,并在 浏览器中加载此文件(参看 下载 部分以获得本文使用的所有示例 HTML 文件)。注意到每次重载此页面 时,该代码都会立即执行。

alert 是个函数调用,只有一个字符串作为参数。图 1 显示了由清单 1 中的代码弹出的警告框,显 示文本 “Hello, World”。如果代码在 HTML body 之内(目前并未指定任何 body,但浏览 器能接受不规则的 HTML,并且整个页面都默然作为一个 body 被处理)。页面一旦加载,JavaScript 就 会立即执行。

图 1. Hello, world

时间: 2024-11-04 19:44:03

跨越边界: JavaScript语言特性的相关文章

《JavaScript核心概念及实践》——1.2 JavaScript语言特性

1.2 JavaScript语言特性 JavaScript是一门动态的.弱类型.基于原型的脚本语言.在JavaScript中"一切皆对象",在这一方面,它比其他的面向对象的语言来得更为彻底.即使作为代码本身载体的函数(function),也是对象,数据与代码的界限在JavaScript中已经相当模糊.虽然它被广泛应用在Web客户端,但是其应用范围远远未局限于此.下面就这几个特点分别介绍. 1.2.1 动态性动态性是指,在一个JavaScript对象中,要为一个属性赋值,我们不必事先创建

理解Javascript的动态语言特性_javascript技巧

Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? var i = 100; function myFunc() { var i = 'test'; eval('i = "hello."'); } myFunc(); alert(i

跨越边界: 活动记录和Java编程中特定于域的语言

DSL 是专门解决特定于域问题的语言.通过更接近问题的操作,DSL 可以提供在通用语言中可能找不 到的好处.Java 世界中充满了 DSL.属性文件.Spring 上下文.标注的某种用法以及 Ant 任务,都是 DSL 的示例. 在开始研究其他像 Ruby 这样的语言的时候,我开始理解到 Java 语言目前对于 DSL 还没有良好的把 握.在这篇文章中,将看到 Ruby 使用的四种集成干净的 DSL 的技巧.然后,将看到在 Java 语言中可 能存在的选项是什么. 隐藏语言的世界 虽然您可能不知

理解Javascript的动态语言特性

  这篇文章主要介绍了理解Javascript的动态语言特性,需要的朋友可以参考下 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? ? 1 2 3 4 5 6 7 var i = 100; function myFunc() { var

《MacTalk 跨越边界》一一2.2程序员如何选择技术方向

2.2程序员如何选择技术方向 MacTalk 跨越边界 最近写了<程序员真正的价值>和<当程序员老去>两篇文章,传播甚广,今天是第三篇--<程序员如何选择技术方向>,史称"程序员三部曲". 那之前写的几篇程序员文章算什么呢?算前传吧.以后再写程序员文章算什么呢?算后记吧. 2008年秋天的一个午后,温暖的阳光透过落地窗落在我面前这个长长的写字桌上,桌子对面坐的是一个瘦小的程序员,他的名字叫小明,小明有些茫然,他看着我,不知道该说些什么. 程序员都是很

跨越边界: Lisp之美

Lisp 长久以来一直被视为伟大的编程语言之一.其漫长的发展过程(接近五十年)中引发的追随狂潮 表明:这是一门非同凡响的语言.在 MIT,Lisp 在所有程序员的课程中占了举足轻重的地位.像 Paul Graham 那样的企业家们将 Lisp 卓越的生产力用作他们事业成功起步的推动力.但令其追随者懊恼万分 的是,Lisp 从未成为主流编程语言.作为一名 Java 程序员,如果您花一点时间研究 Lisp 这座 被人遗忘的黄金之城,就会发现许多能够改进编码方式的技术. 我最近第一次完成了马拉松赛跑

跨越边界:浅谈Java模型以外的类型策略

当谈到 Java 语言的类型方法时,Java 社区分为两大阵营.一些人喜欢编译时错误检查,更好的安全 性,以及改善的工具 -- 这些都是静态类型所能提供的特性.而另一些人则偏爱更动态的类型体验.这 一次在 跨越边界 中,您将看到两种高生产力的非 Java 语言所使用的一些截然不同的类型策略,并发现 在 Java 编程中提高类型灵活性的一些方法. 在对任何编程语言的讨论中,争议较大的一个问题就是类型模型.类型决定可以使用哪些种类的工具 ,并影响到应用程序的设计.很多开发人员将类型与生产率或可维护性

跨越边界: Streamlined,第1部分

我生平首次参加马拉松培训.马拉松培训最有趣的方面--实际上,也是惟一的方面--就是提高不 断叠加所带来的影响.有时,我为了提高效率而进行专门为了改进身体条件而设计的长短跑.有时,在跑 步过程中,我学习避免小的错误,避免重复多余的姿势(多余的姿势对单个步幅没有太大影响,但却会在 整个 26.2 英里的跑步过程中浪费能量或伤害到我).我每周都有提高,可每周之间的区别并不显著.但 是一个训练计划周期过后,我会从最初只能跑 4 英里提高到能跑 26.2 英里.软件开发也与此类似.如 果持续进行小的改进,

跨越边界: 闭包

10 年前,我刚刚开始山地自行车运动的时候,我更愿意选用零件尽可能少尽可能简单的自行车.稍后 ,我意识到一些零件(如后减震器)可以保护我的背部和我自行车的框架在德克萨斯州高低起伏的山区中 免受损害.我于是可以骑得更快,出问题的次数也渐少.虽然随之带来了操作上的复杂性和维护需求的增 加,但对于我来说这点代价还是值得的. 关于闭包这个问题,Java 爱好者们现在陷入了类似的争论中.一些人认为闭包带给编程语言的额外复 杂性并不划算.他们的论点是:为了闭包带来的一点点便利而打破原有语法糖的简洁性非常不值