第7章 函数表达式
定义函数的方式有两种:一种是函数声明、另一种就是函数表达式。
递归:
递归函数是在一个函数通过名字调用自身的情况下构成的。
arguments.callee是一个指向正在执行的函数的指针。
闭包:
闭包是指有权访问另一个函数作用域中的变量的函数。
后台的每个执行环境都有一个表示变量的对象—变量对象。显然,作用域链本质上是一个指向变量对象的指针列表。
在另一个函数内部定义的函数会将外部函数的活动对象添加到它的作用域链中。
由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包可能会导致内存占用过多。
作用域链的这种配置机制引出了一个值得注意的副作用,即闭包只能取得包含函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。
如果闭包的作用域链中保存着一个HTML元素,那么就意味着该元素将无法销毁。
小结:
使用闭包可以在javascript中模仿块级作用域。
闭包还可以用于在对象中创建私有变量。
第8章 BOM
ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript的话,那么BOM(浏览器对象模型)则无疑才是真正的核心。BOM提供了很多对象,用于访问浏览器的功能。W3C为了把浏览器中JavaScript最基本的部分标准化,已经将BOM的主要方面纳入了HTML5规范中。
window对象:
BOM的核心对象是window,它表示浏览器的一个实例。在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。
定义全局变量与在window对象上直接定义属性还是有一点差别:全局变量不能通过delete操作符删除,而直接在window对象上的定义的属性可以。
窗口关系及框架:
如果页面中包含框架,则每个框架都拥有自己的window对象,并且保存在frames集合中。可以通过frames[0]或window.frames[0]或top.frames[0]来访问。
Top对象始终指向最外层的框架,也就是浏览器窗口。与top相对的另一个window对象是parent对象,始终指向当前框架的直接上层框架。与框架有关还有一个self对象,实际上可以与window对象互换使用。所有这些对象都是window对象的属性,可以通过window.parent、window.top等形式访问。
窗口位置:
确定窗口相对于屏幕左边和上边的位置:
Var letfPos = (typeof window.screenLeft == ‘number’) ? window.screenLeft : window.screenX;
Var topPos = (typeof window.screenTop == ‘number’) ? Window.screenTop : window.screenY;
窗口大小:
有四个属性:innerWidth、innerHeight、outerWidth、outerHeight返回视口(viewport)大小。
document.documentElement.clientWidth、document.documentElement.clientHeight中保存了页面视口的信息。
导航和打开窗口:
使用window.open()方法既可以导航到一个特定的URL,也可以打开一个新的浏览器窗口。
超时调用和间歇调用:
超时调用需要使用window对象的setTimeout()方法,它接受两个参数:要执行的代码和以毫秒表示的时间。其中,第一个参数可以是包含JavaScript代码的字符串,也可以是一个函数。经过该时间后指定的代码不一定会执行,第二个参数告诉JavaScript再过多长时间把当前任务添加到队列中。
间歇调用使用setInterval(),与超时调用类似,只不过它会按照指定的时间间隔重复执行代码。
一般认为使用超时调用来模拟间歇调用是一种最佳模式,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。
系统对话框:
alert、confirm、prompt
还有两个可以通过JavaScript打开的对话框,即“查找”和“打印”,window.print()、window.find();
location对象:
location是最有用的BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能。事实上,location对象是很特别的一个对象,因为它既是window对象的属性, 又是document对象的属性。
属性:hash、host、hostname、href(带协议)、pathname、port、protocol、search
位置操作:
Location.assign(“http://www.jinjumao.club”); 下面两种方式其实是调用的该方法
Window.location = “http://www.jinjumao.club”;
locatin.href = “http://www.jinjumao.club”;
禁用浏览器后退按钮:location.replace(“http://www.jinjumao.club”);
重新加载当前页面:location.reload();
navigator对象:
非IE浏览器检测插件:navigator.plugins
screen对象:
Screen对象基本上只用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息,如像素宽度和高度等。
history对象:
History对象保存着用户上网的历史记录,从窗口被打开的那一刻开始。
使用go()方法可以在用户的历史记录中任意跳转,可以向后也可以向前。这个方法接受一个参数,表示向后或向前跳转的页面数的一个整数值。负数表示向后,正数表示向前。
对于加载到窗口、标签页或框架中的第一个页面而言,history.length等于0。
第9章 客户端检测
能力检测:
最常用也最为人们广泛接受的客户端检测形式是能力检测(又称特性检测)。
DOM对象是宿主对象,IE8及更早版本中的宿主对象是通过COM而非JScript实现的。因此,document.createElement()函数确实是一个COM对象,所以typeof才会返回”object”。IE9纠正了这个问题,对所有DOM方法都返回“function”。
怪癖检测:
“怪癖”都是个别浏览器所独有的,而且通常被归为bug。
用户代理检测:
用户代理检测通过检测用户代理字符串useragent来确定实际使用的浏览器。
Gecko是Firefox的呈现引擎。
2003年,Apple公司宣布要发布自己的Web浏览器,名字定为Safari。Safari的呈现引擎叫WebKit,是Linux平台中Konqueror浏览器的呈现引擎KHTML的一个分支。
五大呈现引擎:IE、Gecko、WebKit、KHTML和Opera。
呈现引擎检测顺序:
(1)Opera:window.opera
(2)WebKit:WebKit的用户代理字符串中的”AppleWebKit”是独一无二的。
(3)KHTML
(4)Gecko
(5)IE:IE的版本号位于字符串“MISE“的后面、一个分号的前面。