异常
异常是干扰程序的正常流程的不寻常的事故,当发现这样的事故时,你的程序应该抛出一个异常:
var add = function(a,b){ if(typeof a!== 'number'||typeof b!== 'number'){ throw{ name:'TypeError', message:'add needs number' } } return a+b; } var try_it = function(){ try{ add("seven"); }catch(e){ document.writeln(e.name+':'+e.message); } } try_it();
throw语句中断函数的执行,它应该抛出一个exception对象,该对象包括一个用来识别异常类型的name属性和一个描述性的message属性,还可以添加其他属性
该exception属性被传递到一个try语句的atch从句:
如果在try代码块内抛出一个异常,控制权跳转到catch从句。
一个try语句只会有一个捕获所有异常的catch代码块,如果异常处理手段取决于异常的类型,那么异常处理器必须检查异常对象的name属性来确定异常类型。
扩充类型的功能
javascript允许给语言的基本类型扩充功能,举例说我们可以给 Function.prototype增加方法来使得该方法对所有函数可用:
Function.prototype.method = function(name,func){ this.prototype[name] = func; return this; }
通过给Function.prototype增加一个method方法,我们下次给对象增加方法的时候就不用键入prototype这几个字符。
为Number类添加一个integer方法,它会根据数字的正负来判断使用Math.ceilig还是Math.floor
Number.method('integer',function(){ return Math[this<0?'ceil':'floor'](this); }); document.writeln((-10/3).integer());
javascript还缺少一个移除字符串首尾空白的方法,这个小疏忽很容易弥补:
String.method('trim',function(){ return this.replace(/^\s+|\s+$/g,''); }); document.writeln('""'+" neat ".trim() + '""');
另一个要注意的是for in
语句在原型上表现很糟糕,可以使用hasOwnProperty方法筛选出继承而来的属性
递归
递归函数就是会直接或者间接调用自身的一种函数。递归把一个问题分解为一组相似的子问题,每一个都用寻常解去解决,一般来说,一个递归函数调用自身去解决他的子问题
var hanoi = function(disc,src,aux,dst){ if(disc>0){ hanoi(disc-1,src,dst,aux); document.writeln('move dist'+disc + ' from ' + src +' to ' + dst); hanoi(disc-1,aux,src,dst); } }
经典汉诺塔问题,结果
move dist1 from 起始柱 to 目标柱 move dist2 from 起始柱 to 中间柱 move dist1 from 目标柱 to 中间柱 move dist3 from 起始柱 to 目标柱 move dist1 from 中间柱 to 起始柱 move dist2 from 中间柱 to 目标柱 move dist1 from 起始柱 to 目标柱
其他的递归例子
//定义walk_the_DOM函数,它从某个指定节点开始,按照html源码中的顺序 //访问该树的每个节点 //它会调用一个函数,并依此传递每个节点给他 //walk_the_DOM调用自身去处理每一个子节点 var walk_the_DOM = function walk(node,func){ func(node); node = node.firstChild; while(node){ walk(node,func); node = node.nextSibling; } }
//它以一个属性名称字符串和一个可选的匹配值作为参数 //调用walk_the_DOM,传递一个用来查找节点属性名的函数作为参数 //匹配结果累加到结果数组 var getElementsByAttribute = function(att,value){ var result = []; walk_the_DOM(document.body,function(node){ var actual = node.nodeType === 1&&node.getAttribute(att); if(typeof actual === 'string' && (actual === value||typeof value!=='string')){ result.push(node); } }); return result; }
尾递归:在函数的最后执行递归调用的语句的特殊递归
作用域
在javascript中函数内的参数和变量在函数外是不可见的,在一个函数内部定义的变量,在函数内任何位置都可见,最好的做法是在函数体顶部声明函数中可能用到的所有变量
var foo = function(){ var a = 3,b = 5; var bar = function(){ var b= 7,c = 11; //a=3,b=7,c=11 a+= b+c; //a=21,b=7,c=11 } bar(); //a=21,b=5,a变了,b没变是因为a是全局的,而b是局部的 } foo();
相关推荐
《JavaScript语言精粹》这本书是深入理解这一语言的宝贵资源,它涵盖了JavaScript的核心概念和技术,旨在帮助读者掌握这门语言的精髓。 在描述中提到的"JavaScript语言精粹 包含pdf 与 epub"表明,这本书提供了两种...
《JavaScript语言精粹》是一本深受开发者喜爱的经典书籍,它深入浅出地讲解了JavaScript的核心概念和最佳实践。这本书的中文高清PDF版本包含了详细的注解和书签,为读者提供了便利的学习路径。作为标签,"JavaScript...
《JavaScript语言精粹》是一本深受开发者欢迎的权威书籍,旨在深入探讨JavaScript这门重要的编程语言,帮助初学者和有经验的程序员掌握其核心概念和最佳实践。这本书以中文高清PDF的形式提供,使得读者可以方便地...
这本书《JavaScript语言精粹》无疑是深入理解和掌握这门语言的重要参考资料。它旨在帮助开发者掌握JavaScript的核心概念,提高编程技能,并理解如何写出高效、可维护的代码。 《JavaScript语言精粹》可能会涵盖以下...
JavaScript是一门在Web开发中不可或缺的编程语言,它被用于创建交互式的网页内容和增强用户体验。虽然它广受欢迎,但同样伴随着许多争议和挑战。在《JavaScript 精粹》一书中,作者深入探讨了JavaScript的特性和最佳...
《JavaScript语言精粹 修订版》是一本深受前端开发者喜爱的经典教材,专注于讲解JavaScript的核心概念和最佳实践。这本书深入浅出地介绍了JavaScript的精髓,帮助读者掌握这门强大的脚本语言,尤其对于前端开发人员...
"JavaScript语言精粹(修订版)"是一本深入探讨JavaScript编程精髓的书籍,旨在帮助开发者掌握其核心概念、最佳实践以及常见陷阱。这本书对初学者和经验丰富的开发者都具有很高的价值,能够提升对JavaScript的理解和...
《JavaScript语言精粹》修订版还涵盖了JavaScript的最新发展,例如ES6及后续版本的新特性,如箭头函数、类、模板字符串、解构赋值等。此外,Douglas Crockford对语言中的一些"坏部分"(如with关键字和全局变量)进行...
"JavaScript语言精粹_修订版【高清】带书签 PDF"是一本专门为JavaScript初学者和进阶者编写的指南,旨在帮助读者深入理解并掌握这种强大的脚本语言。 该书修订版可能包含对原版内容的更新和优化,以适应不断发展的...
JavaScript语言精粹修订版pdf是许多朋友都在寻找的一款学习资料,在这里能够为您详细的介绍JS这门计算机语言,作者从语法、对象、函数、继承、数组、正则表达式、方法、样式和优美的特性这9 个方面来呈现这门语言...
"JavaScript语言精粹_修订版带书签.pdf" 这本书是开发者深入理解JavaScript语法、特性及最佳实践的重要参考资料。书中的修订版意味着它包含了最新的更新,以适应JavaScript语言的不断发展。 JavaScript最初由...
本书通过对JavaScript语言的分析,甄别出好的和坏的特性,从而提取出相对这门语言的整体而言具有更好的可靠性、可读性和可维护性的JavaScript的子集,以便你能用它创建真正可扩展的和高效的代码。 雅虎资深...
JavaScript 语言精粹是学习这一重要编程语言的基础资源,涵盖了从基本语法到高级特性的全面内容。这本书包含了中文和英文两个版本,方便不同语言背景的学习者参考。 首先,我们要理解JavaScript的基础知识,包括...