window对象

BOM的核心对象是window,它表示浏览器的一个实例。在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMScript规定的Global对象。

全局作用域

由于window对象同时扮演着ECMAScript中Global对象的角色,因此所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法。来看下面的例子:

var age=29;
function sayAge(){
alert(this.age);
}
alert(window.age); //
sayAge(); //
window.sayAge(); //

定义全局变量与在window对象上直接定义属性还有一点差别就是:全局变量不能通过delete操作符删除,而直接在window对象上定义的属性可以,例如:

var age=29;
window.color="red"; delete window.age' //在IE<9时抛出错误,在其他所有浏览器中都返回false delete window.color //在IE<9时抛出错误,在其他所有浏览器中都返回true
alert(window.age) ;//29
alert(window.color); //undefined

原因是使用var语句添加的window属性有一个名为[[Configurable]]的特性,这个特性的值被设置为false,因此这样定义的属性不可通过delete操作符删除。
另外,还要记住一件事:尝试访问未声明的变更会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变更是否存在,如:

//这里会抛出错误,因为oldValue未定义
var newValue=oldValue; //这里不会抛出错误,因为这是一次属性查询
//newValue的值是undefined
var newValue=window.oldValue;

窗口关系及框架

top对象始终指向最高(最外)层的框架,也就是浏览器窗口。与框架有关的最后一个对象是self,它始终指向window;实际上,self和window对象可以互换使用。引入
self对象的目的只是为了与top和parent对象对应起来,因此它不格外包含其它值。

窗口位置

使用下面的代码可以跨浏览器取得窗口左边和上边的位置。

var leftPos=(typeof windwow.screenLeft=="number")?
window.screenLeft:window.screenX;
var topPos=(typeof windwow.screenTop=="number")?
window.screenTop:window.screenY;

使用resizeTo()和resizeBy()方法可以调整浏览器窗口的大小 。

导航和打开窗口

window。open("http://www.wrox.com","topFrame");

如果有一个名叫"topFrame"的窗口或者框架,就会在该窗口或框架加载这个URL;否则,就会创建一个新窗口并将其命名为"topFrame".

在Chrome中,将新创建的标签页的opener属性设置为null,即表示在单独的进程中运行新标签页,如下所示:

var wroxWin=window.open("http://www.wrox.com","wroxWindow","height=400,width=400,top=10,left=10,resizable=yes");
wroxWin.opener=null;

将opener属性设置为Null就是告诉浏览器新创建的标签页不需要与打开它的标签页通信,因此可以在独立的进程中运行。

间隙调用和超时调用

JavaScript是一个单线程序的解释器,因此一定时间内只能执行一段代码。为了控制要执行的代码,就有一个JavaScript任务队列。这些任务会按照将它们添加到队列的顺序执行。
setTimout()的第二个参数告诉JavaScript再过多长时间把当前任务添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么它就要等前面的代码
执行完以后再执行。
要取消尚未执行的超时调用计划,可以调用clearTimeout()方法并将相应的超时调用ID作为参数传递给它,如下所示:

//设置超时调用
var timeoutId=setTimout(function(){
alert("Hello world!");
},1000);
//注意:把它取消
clearTimeout(timeoutId);

间隙调用与超时调用类似,只不过它会按照指定的时间间隔重复执行代码,直至间歇调用被取消或者页面被卸载。设置间歇调用的方法是setInterval().

//不建议传递字符串
setInterval("alert('Hello world!')",10000); //推荐的调用方式
setInterval(function(){
alert("Hello world!");
},10000);

虽然这两种调用方式都没有问题,但由于传字符串可能导致性能损失,因此不建议以字符串作为第一个参数。
也可以用clearInterval()方法并传入相应的间隙ID来取消。以下是一个常见的使用间歇调用的例子:

var num=0;
var max=10;
var intervalId=null; function incrementNumber(){
num++;
//如果执行次数达到max设定的值,则取消后续尚未执行的调用
if(num==max)
{
clearTimeout(intervalId);
alert("Done");
}
}
intervalId=setInterval(incrementNumber,500);

这个例子也可以用超时调用来实现,如下:

var num=0;
var max=10; function incrementNumber(){
num++;
//如果执行次数未达到max设定的值,则设置另一次超时调用
if(num<max)
setTimout(incrementNumber,500);
else
alert("Done");
}
setTimout(incrementNumber,500);

一般认为,使用超时调用来模拟间歇调用是一种最佳模式。在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。
而像前面示例中那样使用超时调用,则完全可以避免这一点。所以,最好不要使用间歇调用。

更简洁的写法:

setTimeout(function(){
//processing
setTimeout(arguments.callee, interval);
}, interval);

JavaScript高级程序设计学习笔记--BOM的更多相关文章

  1. JavaScript高级程序设计---学习笔记(一)

    今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...

  2. javascript高级程序设计学习笔记

    javascript高级程序设计,当枕头书已经好久了~zz  现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...

  3. JavaScript高级程序设计学习笔记第八章--BOM

    1.间歇调用和超时调用: 超时调用:需要使用 window 对象的 setTimeout()方法,它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒).其中,第一个参数可以 ...

  4. JavaScript高级程序设计---学习笔记(二)

    面向对象程序设计1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直 ...

  5. JavaScript高级程序设计学习笔记第一章

    作为学习javascript的小白,为了督促自己读书,写下自己在读书时的提炼的关键点. 第一章: 1.JavaScript简史:Netscape Navigator中的JavaScript与Inter ...

  6. Javascript高级程序设计学习笔记一

    看完w3school的javascript的概念,有点基础,开始红皮书的路程,今晚总结前二章的心得. 第一章:javascript简介 重点是javascript的实现是由 ECMAScript(核心 ...

  7. javascript 高级程序设计 学习笔记

    <!--<script> // 异步请求封装 IE6即以上浏览器 // ajax(url,fnSucc,selectID,fnFaild) //url 请求地址 //fnSucc 异 ...

  8. JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承

    相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...

  9. JavaScript高级程序设计学习笔记之事件

    1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...

随机推荐

  1. YOLO: Real-Time Object Detection

    YOLO detection darknet框架使用 YOLO 训练自己的数据步骤,宁广涵详细步骤说明

  2. Android开发自学笔记(Android Studio) 目录

    开发环境如下: 操作系统:Windows 10 Pro IDE:Android Studio 1.3.X 或更高版本 其它请参见文章说明. 1. 环境搭建 1.1 (番外)AndroidStudio常 ...

  3. shell浅谈之十函数

    转自:http://blog.csdn.net/taiyang1987912/article/details/39583179 一.简介 Linux Shell编 程中也会使用到函数,函数可以把大的命 ...

  4. 光盘刻录 CD刻录软件 Ashampoo Burning Studio特别版 刻录CD就这么简单

    著名的刻录软件Nero,其近上百M体积实在太大,而且安装之后的文件体积也有上G多.这么大的体积安装使用都不方便,好在现在很多都做得很不错,比如阿香婆的光盘刻录软件Ashampoo® Burning S ...

  5. IBatisNet使用教程

     1.是数据持久层,对应.NET方向的有Ibatis.NET,只要用来处理数据库表结构和程序实体之间映射,ado.net是用来处理和数据库直接通信的,取出数据(object,int,string,da ...

  6. bzoj 1065: [NOI2008] 奥运物流

    1065: [NOI2008] 奥运物流 Description 2008北京奥运会即将开幕,举国上下都在为这一盛事做好准备.为了高效率.成功地举办奥运会,对物流系统 进行规划是必不可少的.物流系统由 ...

  7. 【CityHunter】基于LBS的AR体感游戏设计理念

    本人目前还不是游戏行业的圈内人士,并不懂得,游戏行业的生态圈,也不懂得,所谓的什么“中国市场环境”.所以不敢发表关于这方面的见解,不过我在这里想要插一句话,就是我认为啊,行业内,人与人之间还是有分层次 ...

  8. 硬盘下安装Ghost系统简易教程

    硬盘安装器下载:https://eyun.baidu.com/s/3c2NvcvI 密码:Cv7F 使用本方法可在没有光驱.光盘.启动U盘等任何系统安装设备的情况下安装Ghost版XP.Win7/8/ ...

  9. bootstrap做了一个表格

    花了一下午做了一个表格: 大致是这样: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf ...

  10. HTML5触摸事件(touchstart、touchmove和touchend) (转)

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...