- 浏览: 536079 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
rgqancy:
终于明白为啥XML里要带jdbcType=XXXX了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
rzh0001:
Thanks a lot
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
guji528:
学习了,谢谢
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
AKka:
彻底清楚这个错误的原因了。向楼主学习了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
远去的渡口:
武汉小吃,我最爱热干面和鸭脖,想念啊~~
过年时候还学习编程, ...
过年的心情
JavaScript 技巧与高级特性 |
级别: 中级 成 富 (chengfbj@cn.ibm.com ), 软件工程师, IBM 中国软件开发中心 2008 年 11 月 14 日 随着 Ajax 应用的流行,JavaScript 语言得到了越来越多的关注。开发人员对 JavaScript 的使用也日益深入。 JavaScript 已经不再只是用来为页面添加一些花哨的效果,它已经成为构建 Ajax 应用的重要基石。 JavaScript 作为一种专门设计用来在浏览器中执行的动态语言,它有许多重要的特性,并且不同于传统的 Java 或 C++ 语言。熟悉这些特性可以帮助开发者更好的开发 Ajax 应用。本文章介绍了 JavaScript 语言中十三个比较重要的特性,包括 prototype、执行上下文、作用域链和闭包等。<!----><!----> <!----> JavaScript 中一共有 5 种基本类型,分别是 String、Number、Boolean、Null 和 Undefined 。前 3 种都比较好理解,后面两种就稍微复杂一点。 Null 类型只有一个值,就是 null ; Undefined 类型也只有一个值,即 undefined 。 null 和 undefined 都可以作为字面量(literal)在 JavaScript 代码中直接使用。 null 与对象引用有关系,表示为空或不存在的对象引用。当声明一个变量却没有给它赋值的时候,它的值就是 undefined 。 undefined 的值会出现在如下情况:
关于 null 和 undefined 有一些有趣的特性:
对于 if 表达式,大家都不陌生。 JavaScript 中 if 后面紧跟的表达式的真假值判断与其它语言有所不同。具体请看表 1 。 表 1. JavaScript 中的真假值
从表 1 中可以看到,在 JavaScript 中使得 if 判断为假的值可能有 null、undefined、false、+0、-0、NaN 和空字符串("")。
JavaScript 中有两个判断值是否相等的操作符,== 与 === 。两者相比,== 会做一定的类型转换;而 === 不做类型转换,所接受的相等条件更加严格。 在使用 === 来判断两个值是否相等的时候,如判断
在使用 == 来判断两个值是否相等的时候,如判断
A == B, B == C
并不能一定得出A == C
。考虑下面的例子,var str1 = new String("Hello"); var str2 = new String("Hello"); str1 == "Hello"; str2 == "Hello"
,但是str1 != str2
。
JavaScript 中的数组(Array)和通常的编程语言,如 Java 或是 C/C++ 中的有很大不同。在 JavaScript 中的对象就是一个无序的关联数组,而 Array 正是利用 JavaScript 中对象的这种特性来实现的。在 JavaScript 中,Array 其实就是一个对象,只不过它的属性名是整数,另外有许多额外的属性(如 length)和方法(如 splice)等方便地操作数组。 创建一个 Array 对象有两种方式,一种是以数组字面量的方式,另外一种是使用 Array 构造器。数组字面量的方式通常为大家所熟知。如 JavaScript 中的 Array 提供了很多方法。
JavaScript 中数组的 length 属性与其他语言中有很大的不同。在 Java 或是 C/C++ 语言中,数组的 length 属性都是用来表示数组中的元素个数。而 JavaScript 中,length 属性的值只是 Array 对象中最大的整数类型的属性的值加上 1 。当通过 [] 操作符来给 Array 对象增加元素的时候,如果 [] 中表达式的值可以转换为正整数,并且其值大于或等于 Array 对象当前的 length 的值的话,length 的值被设置成该值加上 1 。 length 属性也可以显式的设置。如果要设置的值比原来的 length 值小的话,该 Array 对象中所有大于或等于新值的整数键值的属性都会被删除。如代码清单 1 中所示。 清单 1. Array 的 length 属性
在 JavaScript 中,在一个 function 内部可以使用 arguments 对象。该对象中包含了 function 被调用时的实际参数的值。 arguments 对象虽然在功能上有些类似数组(Array ), 但是它不是数组。 arguments 对象与数组的类似体现在它有一个 length 属性,同时实际参数的值可以通过 [] 操作符来获取。但是 arguments 对象并没有数组可以使用的 push、pop、splice 等 function 。其原因是 arguments 对象的 prototype 指向的是 Object.prototype 而不是 Array.prototype 。 Java 和 C++ 语言都支持方法重载(overloading),即允许出现名称相同但是形式参数不同的方法;而 JavaScript 并不支持这种方式的重载。因为 JavaScript 中的 function 对象也是以属性的形式出现的,在一个对象中增加与已有 function 同名的新 function 时,旧的 function 对象会被覆盖。不过可以通过使用 arguments 来模拟重载,其实现机制是通过判断 arguments 中实际参数的个数和类型来执行不同的逻辑。如代码清单 2 中所示。 清单 2. 使用 arguments 模拟重载示例
callee 是 arguments 对象的一个属性,其值是当前正在执行的 function 对象。它的作用是使得匿名 function 可以被递归调用。下面以一段计算斐波那契序列(Fibonacci sequence)中第 N 个数的值的代码来演示 arguments.callee 的使用,见代码清单 3 。 清单 3. arguments.callee 示例
JavaScript 中的每个对象都有一个 prototype 属性,指向另外一个对象。使用对象字面量创建的对象的 prototype 指向的是 图 1. JavaScript prototype 链示意图 在图 1
中, prototype 链在属性查找过程中会起作用。当在一个对象中查找某个特定名称的属性时,会首先检查该对象本身。如果找到的话,就返回该属性的值;如果找不到的话,会检查 该对象的 prototype 指向的对象。如此下去直到找到该属性,或是当前对象的 prototype 为 null 。 prototype 链在设置属性的值时并不起作用。当设置一个对象中某个属性的值的时候,如果当前对象中存在这个属性,则更新其值;否则就在当前对象中创建该属性。 JavaScript 中并没有 Java 或 C++ 中类(class)的概念,而是通过 prototype 链来实现基于 prototype 的继承。在 Java 中,状态包含在对象实例中,方法包含在类中,继承只发生在结构和行为上。而在 JavaScript 中,状态和方法都包含在对象中,结构、行为和状态都是被继承的。这里需要注意的是 JavaScript 中的状态也是被继承的,也就是说,在构造器的 prototype 中的属性是被所有的实例共享的。如代码清单 4 中所示。 清单 4. JavaScript 中状态被继承的示例
代码清单 4
中的问题在于将
JavaScript
中的 this 一直是容易让人误用的,尤其对于熟悉 Java 的程序员来说,因为 JavaScript 中的 this 与 Java 中的
this 有很大不同。在一个 function 的执行过程中,如果变量的前面加上了 this 作为前缀的话,如 this 的值取决于 function 被调用的方式,一共有四种,具体如下:
清单 5. 内部 function 的 this 值
JavaScript 中并没有 Java 或是 C++ 中的类(class)的概念,而是采用构造器(constructor)的方式来创建对象。在 new 表达式中使用构造器就可以创建新的对象。由构造器创建出来的对象有一个隐含的引用指向该构造器的 prototype 。 所有的构造器都是对象,但并不是所有的对象都能成为构造器。能作为构造器的对象必须实现隐含的 new 操作符会影响 function 调用中 return 语句的行为。当 function 调用的时候有 new 作为前缀,如果 return 的结果不是一个对象,那么新创建的对象将会被返回。在代码清单 6
中,function 清单 6. new 操作符对 return 语句行为的影响
JavaScript 中的 eval 可以用来解释执行一段 JavaScript 程序。当传给 eval 的参数的值是字符串的时候,该字符串会被当成一段 JavaScript 程序来执行。 除了显式的调用 eval 之外,JavaScript 中的有些 function 能接受字符形式的 JavaScript 代码并执行,这相当于隐式的调用了 eval 。这些 function 的典型代表是 清单 7. 隐式的 eval 示例
在 目前的 Ajax 应用中,JSON 是一种流行的浏览器端和服务器端处之间传输数据的格式。服务器端传过来的数据在浏览器端通过 JavaScript 的 eval 方法转换成可以直接使用的对象。然而,在浏览器端执行任意的 JavaScript 会带来潜在的安全风险,恶意的 JavaScript 代码可能会破坏应用。对于这个问题,有两种解决方式: {} &&
,再调用 eval 。关于这两种方法的细节,请看参考资料
。清单 8. RFC 4627 中给出的检查 JSON 字符串的方法
执行上下文(execution context)和作用域链(scope chain) 执行上下文(execution context)是 ECMAScript 规范(请看参考资料 ) 中用来描述 JavaScript 代码执行的抽象概念。所有的 JavaScript 代码都是在某个执行上下文中运行的。在当前执行上下文中调用 function 的时候,会进入一个新的执行上下文。当该 function 调用结束的时候,会返回到原来的执行上下文中。如果 function 调用过程中抛出异常,并没有被捕获的话,有可能从多个执行上下文中退出。在 function 调用过程,也可能调用其它的 function,从而进入新的执行上下文。由此形成一个执行上下文栈。 每个执行上下文都与一个作用域链(scope chain)关联起来。该作用域链用来在 function 执行时求标识符(Identifier)的值。在该链中包含多个对象。在对标识符进行求值的过程中,会从链首的对象开始,然后依次查找后面的对象,直到在 某个对象中找到与标识符名称相同的属性。如”protype 链与继承“ 中所述,在每个对象中进行属性查找的时候,会使用该对象的 prototype 链。在一个执行上下文中,与其关联的作用域链只会被with 语句和 catch 子句影响。 在进入一个新的执行上下文的时候,会按顺序执行下面的操作:
图 2 中给出了 function 执行过程中的作用域链的示意图,其中的虚线表示作用域链。 图 2. 作用域链示意图
function a() {}、var a = function() {} 与 var a = new Function() 在 JavaScript 中,function 对象的创建方式有三种:function 声明、function 表达式和使用 Function 构造器。通过这三种方法创建出来的 function 对象的 function funcName() {}
。使用 function 声明的 function 对象是在进入执行上下文时的变量初始化过程中创建的。该对象的[[scope]]
属性的值是它被创建时的执行上下文对应的作用域链。var funcName = function() {}
。使用 function 表达式的 function 对象是在该表达式被执行的时候创建的。该对象的[[scope]]
属性的值与使用 function 声明创建的对象一样。var funcName = new Function(p1, p2,..., pn, body)
,其中 p1、p2 到 pn 表示的是该 function 的形式参数,body 是 function 的内容。使用该方式的 function 对象是在构造器被调用的时候创建的。该对象的[[scope]]
属性的值总是一个只包含全局对象的作用域链。
with 语句的语法是 由 于 with 语言会把额外的对象添加到作用域链的前面,使用 with 可能会影响性能并造成难以发现的错误。由于额外的对象在作用域链的前面,当执行到 with 里面的语句,需要对一个标识符求值的时候,会首先沿着该对象的 prototype 链查找。如果找不到,才会依次查找作用域链中原来的对象。因此,如果在 with 里面的语句中频繁引用不在额外对象的 prototype 链中的变量的话,查找的速度会比不使用 with 慢。具体见代码清单 9 。 清单 9. with 的用法示例
在代码中,首先通过 prototype 的方式实现了继承。在 with 中,执行
闭 包(closure)是 JavaScript 中一个非常强大的功能。如果使用得当的话,可以使得代码更简洁,并实现在其它语言中很难实现的功能;而如果使用不当的话,则会导致难以调试的错误,也可能 造成内存泄露。只有在充分理解闭包的基础上,才能正确的使用它。理解闭包需要首先理解 JavaScript 中的prototype 链 、执行上下文和作用域链 等概念。 闭 包指的是一个表达式(通常是一个 function),该表达式可以有自由的变量,并且运行环境能够正确的获取这些变量的值。 JavaScript 中闭包的产生是由于 JavaScript 中允许内部 function,也就是在一个 function 内部声明的 function 。内部 function 可以访问外部 function 中的局部变量、传入的参数和其它内部 function 。当内部 function 可以在包含它的外部 function 之外被引用时,就形成了一个闭包。这个时候,即便外部 function 已经执行完成,该内部 function 仍然可以被执行,并且其中所用到的外部 function 的局部变量、传入的参数等仍然保留外部 function 执行结束时的值。 下面通过一个例子来说明闭包的形成,见代码清单 10 。 清单 10. JavaScript 闭包示例代码
在代码清单 10
中,外部 function 下面分析代码清单 10
中执行的细节。首先 在 JavaScript 中,正确的使用闭包可以简化代码。下面举几个例子来说明。 在多人协作开发应用,或是使用第三方开发的 JavaScript 库的时候,一个通常会遇到的问题是名称空间冲突。比如第三方的 JavaScript 库在全局对象中声明了一个属性叫 这个时候典型的做法是只在全局对象中保存一个对象,所有的功能都通过引用此对象来完成。完成功能所需要的内部状态都封装在一个闭包中。如代码清单 11 所示。 清单 11. 使用闭包避免名称空间冲突
代码中通过创建一个匿名 function 并立即执行来生成一个闭包。在闭包中,通过修改全局对象 在 JavaScript 代码运行过程中,不可避免的需要保存一些内部状态。通过使用闭包,可以将内部状态封装在一个 function 内部,使得代码更加简洁。如代码清单 12 所示。 清单 12. 使用闭包保存状态
代码中的 在 JavaScript 中,有些 function,如 清单 13. 使用闭包折叠调用参数
代码中的 |
发表评论
-
html focus 引入 类似微博的效果
2012-09-18 18:01 1397<!DOCTYPE html PUBLIC &q ... -
javascript 类编程(未完)
2010-07-20 18:03 1518最近想总结一下JavaScript类编程,有时间写一点。 J ... -
正则表达式
2010-01-20 14:48 1040正则表达式用于字符串 ... -
insertAdjacentHTML 用法
2010-01-09 21:13 1932insertAdjacentHTML方法示例 添加HTML内 ... -
float margin padding
2009-12-23 16:46 2512今天做网站的时候发 ... -
WEB2.0标准教程:第二天 什么是名字空间
2009-12-14 10:28 1103DOCTYPE声明好以后,接下来的代码是: <html ... -
CSS兼容:如何解决IE7和IE8的BUG
2009-12-14 10:04 2338CSS兼容问题已经是CSS网页布局技术中的重要组成部分,也让 ... -
悟道web标准:前端性能优化
2009-12-14 09:40 1623悟道web标准:前端性能优化 前端性能优化完全是一个技术话题 ... -
JavaScript对象探讨
2009-12-13 11:39 1091由于JavaScript的灵活性,可以让每个人按照自己的习惯进 ... -
用css网站布局之十步实录
2009-12-10 11:32 1329首先需要规划网站,本教程将以下图为例构建网站 其基本布局见 ... -
WEB标准最佳实践:五个需要注意的地方
2009-12-09 21:32 999一、永远使用小写字母 不好的做法: <DI ... -
不要内置JavaScript脚本 并将它置于HTML文档底部
2009-12-09 21:27 1545不要内置JavaScript脚本,这不是1996年了! ... -
javascript uri 编码
2009-10-19 10:53 1969对比 javascript url编码 javascript ... -
javascript 购物车
2009-10-17 13:13 3375购物车相当于现实中超 ... -
doument.execomand 用法
2009-07-11 15:54 14242D-Position 允许通过拖曳移动绝对定位的对象。 ... -
clientX pageX
2009-06-26 15:21 2159screenX:鼠标在显示屏幕上的坐标。 clientX ... -
hasOwnProperty
2009-06-26 11:19 1670JavaScript中hasOwnProperty函数方 ... -
getBoundingClientRect()
2009-06-25 15:16 1314getBoundingClientRect() 来获取页面 ... -
jquery 选择器 使用
2009-06-15 17:01 1500[翻译]jQuery 选择器的使用 ... -
Ext 3.0 core 简要pdf 下载
2009-06-07 11:02 1272今天早上 无意中看到Ext中文 网站有Ext3.0 core ...
相关推荐
下面将详细阐述JavaScript高级知识中的多个重要方面。 1. **原型与原型链**:JavaScript的继承机制基于原型,每个对象都有一个`__proto__`属性,指向创建它的构造函数的原型。通过原型链,我们可以实现属性和方法的...
"JavaScript高级编程"这本书深入探讨了这门语言的高级特性和最佳实践,旨在帮助开发者提升技能水平,实现更高效、更可靠的代码编写。以下是该书可能涵盖的一些关键知识点: 1. **基础语法**:包括变量、数据类型...
以下是一些关键的JavaScript高级知识点,这些内容可能在提供的压缩包文件中有所涉及: 1. **闭包(Closures)**:闭包是JavaScript中的一个重要特性,它允许函数访问并操作其外部作用域的变量,即使在函数执行完毕后...
《JavaScript进阶问题列表》是一份全面覆盖JavaScript高级知识点的问题集合,旨在帮助开发者深入理解JavaScript语言的各个方面,并掌握进阶技巧。每个问题都提供了详细的答案和解析,涵盖了JavaScript的高级特性、...
以下是一些重要的JavaScript高级知识点,它们可能会在复习试题中涉及: 1. **闭包(Closures)**:闭包是JavaScript中一个关键的概念,它允许函数访问并操作其词法作用域内的变量,即使该函数已经返回。理解闭包...
《JavaScript高级程序设计》(第3版)是一本深入探讨该语言精髓的权威书籍,它为读者提供了全面且深入的JavaScript知识,包括语言核心、DOM操作、BOM处理、事件处理以及面向对象编程等多个方面。 在书中,作者详细...
《JavaScript高级程序设计(第3版)》是JavaScript学习者必备的经典教材,它深入讲解了JavaScript的核心概念、语法以及高级特性。这本书由资深JavaScript专家Nicholas C. Zakas撰写,为读者提供了全面且深入的...
"JavaScript高级篇视频教程"旨在帮助已经掌握了JavaScript基础知识的学习者进一步提升技能,深入理解其高级特性,包括面向对象编程、异步处理、模块化、性能优化等多个方面。 在JavaScript的高级篇中,首先会讲解...
以下是对这些高级知识点的详细阐述: 1. **闭包(Closures)**:闭包是JavaScript中的一个核心概念,它允许函数访问并操作其外部作用域的变量,即使在其外部函数已经执行完毕。闭包常用于实现私有变量、数据封装和...
这篇《JavaScript高级教程》全面深入地探讨了这门语言的核心概念和技术,旨在帮助开发者从初级水平跃升至高级阶段。 首先,JavaScript的基础部分涵盖了变量、数据类型(包括基本类型和引用类型)、操作符、流程控制...
《JavaScript高级教程》这本书深入探讨了这一动态语言的核心概念和技术,旨在帮助开发者提升技能,掌握JavaScript的高级用法。 首先,JavaScript是一种解释型的、基于原型的、动态类型的脚本语言。这意味着它不需要...
《JavaScript高级程序设计》是JavaScript编程领域的一本经典著作,由Nicholas C. Zakas撰写。这本书深入探讨了JavaScript的核心概念和技术,对于想要精通JavaScript的开发者来说,是一份宝贵的资源。源码版本更是...
JavaScript 高级知识点 * this 关键字:this 关键字的使用、this 关键字的指向等 * Math 对象:Math.random()、Math.floor() 等 * Date 对象:Date 对象的创建、日期格式的转换等 * 数组操作:数组的创建、数组的...
在阅读这些文档的同时,配合《JavaScript+5.CHM》和《Javascript高级教程.CHM》这两份CHM格式的电子书,可以更直观地查找和学习特定知识点。CHM文件是Microsoft的帮助文档格式,包含了丰富的索引和搜索功能,便于...
不过,根据文件标题“Javascript高级应用与实践.pdf”,我们可以推测文档内容大致会涉及以下几个方面,尽管具体的细节无法得知: 1. JavaScript基础知识回顾:JavaScript是前端开发中最为核心的技术之一,文档可能...
"JavaScript高级程序设计"是一本深入探讨JavaScript编程语言的书籍,旨在帮助读者掌握JS的各个方面,适合自学者进行系统学习。以下是对书中的主要知识点的详细阐述: 1. JavaScript简介: JavaScript是一种广泛...
学习JavaScript高级编程技术,首先需要理解脚本语言的概念。脚本语言是相对于编译型语言而言的,它们通常不需要预编译,而是直接由解释器执行。JavaScript就是这样的脚本语言,它在网页加载时被解释执行,可以实时...
前端开发必备 Javascript 高级程序设计第3版(完整源代码书上每个例子都有)本书从最早期Netscape浏览器中的JavaScript开始讲起,直到当前它对XML和Web服务的具体支持,内容主要涉及JavaScript的语言特点、...
随着对 JavaScript 的深入理解,你可以逐步掌握更高级的概念,如函数、对象、数组、事件处理程序等,从而实现更复杂的网页功能。 总之,JavaScript 是网页开发不可或缺的一部分,它使得静态的 HTML 页面变得生动...