JavaScript精粹(4 2)
http://blog.csdn.net/mouyong/archive/2009/12/07/4959827.aspx
4.9 作用域
在编程语言中,作用域控制着变量与参数的可见性及生命周期。对程序员来说这是一个重要的帮助,因为它减少了名称冲突,并且提供了自动内存管理。
大多数使用C语言语法的语言都拥有块级作用域。在一个代码块中(括在一对花括号中的语句集)定义的所有变量在代码块的外部是不可见的。定义在代码块中的变量在代码块执行结束后会被释放掉。这是件好事。
糟糕的是,尽管代码块的语法似乎表现出它支持块级作用域,但实际上JavaScript并不支持。这个混淆之处可能成为错误之源。
JavaScript确实有函数作用域。定义在函数中的参数和变量在函数外部是不可见的。但在一个函数中的任何位置定义的变量在该函数中的任何地方都可见(默然说话:我的天呀,真是一个灾难。。。。)。
很多现代语言都推荐尽可能迟地声明变量。而用在JavaScript上却会成为糟糕的建议,因为它缺少块级作用域。所以,最好的做法是在函数体的顶部声明函数中可能用到的所有变量。
4.10 闭包
只有函数作用域的好处是内部函数可以访问定义它们的外部函数的参数和变量(除了this和arguments)。这是一件非常好的事情。
我们的getElementsByAttribute函数可以工作是因为它声明了一个results变量,且传递给walk_the_DOM的内部函数也可以访问results变量。
一个更有趣的情形是内部函数拥有比它的外部函数更长的生命周期。
之前,我们构造了一个myObject对象,它拥有一个value属性和一个increment方法。假定我们希望保护该值不会被非法更改。
与前面直接定义一个对象不同,我们通过调用一个函数的形式去初始化myObject,该函数将返回一个对象。此函数定义了一个value变量。该变量对increment和getValue方法总是可见的,但函数的作用域使得它对其他的程序来说是不可见的。
var myObject=function(){
var value=0;
return {
increment:function(inc){
value+=typeof inc==='number'?inc:1;
},
相关文档:
ECMA 本周推出了 JavaScript 5(PDF),除了增强基础函数库之外,还引入了严格运行时模式(Strict Runtime Modes)以避免代码中的常见错误。ECMA ECMAScript 4 的努力曾以失败告终,ECMA 甚至没有发布 ECMAScript 4 细则。
过去几年,诸如 Nitro,TraceMonkey 一类的 JavaScript 引擎发展迅猛,JavaScript 成了 Google Wav ......
在看一些js框架的脚本时,被一个问题狠狠的困扰着,就是下面的代码是什么意思
var KE = {};
KE.version = '3.4.1';
KE.lang = {
source : '切换模式',
undo : '后退(Ctrl+Z)',
redo : '前进(Ctrl+Y)',
cut : '剪切(Ctrl+X)',
copy : '复制(Ctrl+C)',
paste : '粘贴(Ctrl+V)'
......
第6章
数组
数组是一段线性分配的内存,它通
过整数去计算偏移并访问其中的元素。数组可以是很快的数据结构。不幸的是,
JavaScript
的数组不是这样的。它提供了一种拥有类似数组特性的对象。它把数组的下标转变成字符串,用其作为属
性。它明显地比一个真正的数组慢,但它可以更方便地使用。属性的检索和更 ......
第7章
正则表达式
JavaScript
的许多特性都借
鉴自其他语言。语法借鉴自
Java
,函数借鉴自
Scheme
,原型继承借鉴自
Self
。而
JavaScript
的正则表达式特性则借鉴自
Perl
。
正则表达式起源于对形式语言的数
学研究。
在
JavaScript
中,正则表达式的语法是对
Perl
版的改进和发展,它非常 ......
第9章
代码风格
计算机程序是人类制造出来的最复
杂的事物。程序通常由很多部分组成,表现为函数、语句和表达式,它们必须准确无误地按照顺序排列。最终的结果几乎都和实现它的程序没有什么相似之处。在软
件的产品生命周期中,通常它们都会被修改。把一个正确的程序转化为另一个同样正确但风格不同的程序,是 ......