标签:
写在前面:暂时只是粗略的排版,以后还会整理。也可到 http://bulabula.top/高三笔记/笔记7-9.txt 下载TXT版。。
七、函数表达式
1)、定义函数的方式有两种:函数声明和函数表达式。
2)、函数声明提升(function declaration hoisting),意思是在执行代码之前会先读取函数声明。函数声明可以放在调用它的语句后面。
3)、函数表达式:创建一个匿名函数(也可以叫拉姆达函数)并将它赋值给变量。
4)、函数声明和函数表达式的区别:
函数声明必须有名字,函数表达式不需要。
函数声明会提升,函数表达式不会。
函数声明可以在任何位置调用,但是函数表达式必须在声明后调用。
7.1 递归
1)、递归函数是在一个函数通过名字调用自身的情况下构成的。
2)、arguments.callee代表函数本身。
7.2 闭包
1)、当在函数内部定义了其他函数时,就创建了闭包。闭包有权访问包含函数内部的所有变量,原理如下:
在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。
函数的作用域及其所有变量都会在函数执行结束后被销毁。
当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。
7.2.1 闭包与变量
7.2.2 关于this对象
1)、匿名函数的执行环境具有全局性,因此其this 对象通常指向window。
7.2.3 内存泄漏
1)、闭包会引用包含函数的整个活动对象。
7.3 模仿块级作用域
1)、语法:(function(){ //这里是块级作用域 })();
7.4 私有变量
1)、任何在函数中定义的变量,都可以认为是私有变量。包括:函数的参数、局部变量和在函数内部定义的其他函数。
2)、特权方法(privileged method):有权访问私有变量和私有函数的公有方法。
7.4.1 静态私有变量
7.4.2 模块模式
7.4.3 增强的模块模式
八、 BOM
1)、BOM即浏览器对象模型。
8.1 window 对象
1)、window 对象既是通过JavaScript 访问浏览器窗口的一个接口,又是ECMAScript 规定的Global 对象。
8.1.1 全局作用域
1)、全局变量不能通过delete 操作符删除,而直接在window 对象上的定义的属性可以。
8.1.2 窗口关系及框架
1)、每个框架都拥有自己的window 对象,并且保存在frames 集合中。
2)、top 对象始终指向最高(最外)层的框架,也就是浏览器窗口。
3)、parent(父)对象始终指向当前框架的直接上层框架。
4)、self对象始终指向window;self 和window 对象可以互换使用。
8.1.3 窗口位置
1)、跨浏览器取得窗口左边和上边的位置:
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;
8.1.4 窗口大小
8.1.5 导航和打开窗口
1)、window.open()方法既可以导航到一个特定的URL,也可以打开一个新的浏览器窗口。
使用方法:window.open(要加载的URL,窗口目标,一个特性字符串,表示新页面是否取代浏览器历史记录中当前加载页面的布尔值);
可能的值:
窗口目标:
已有窗口或框架的名称。会在该窗口或框架中加载URL。
_self、_parent、_top 或_blank。
一个特性字符串:
设 置 值 说 明
fullscreen yes或no 表示浏览器窗口是否最大化。仅限IE
height 数值 表示新窗口的高度。不能小于100
left 数值 表示新窗口的左坐标。不能是负值
location yes或no 表示是否在浏览器窗口中显示地址栏。不同浏览器的默认值不同。如果设置为no,地址栏可能会隐藏,也可能会被禁用(取决于浏览器)
menubar yes或no 表示是否在浏览器窗口中显示菜单栏。默认值为no
resizable yes或no 表示是否可以通过拖动浏览器窗口的边框改变其大小。默认值为no
scrollbars yes或no 表示如果内容在视口中显示不下,是否允许滚动。默认值为no
status yes或no 表示是否在浏览器窗口中显示状态栏。默认值为no
toolbar yes或no 表示是否在浏览器窗口中显示工具栏。默认值为no
top 数值 表示新窗口的上坐标。不能是负值
width 数值 表示新窗口的宽度。不能小于100
2)、调用close()方法可以(也仅可以)关闭window.open()打开的窗口。
3)、新创建的window 对象有一个opener 属性,其中保存着打开它的原始窗口对象。
8.1.6 间歇调用和超时调用
1)、超时调用需要使用window 对象的setTimeout()方法,它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒)。
2)、clearTimeout()方法用来取消超时调用。
栗子: //设置超时调用
var timeoutId = setTimeout(function() {
alert("Hello world!");
}, 1000);
//注意:把它取消
clearTimeout(timeoutId);
3)、超时调用的代码都是在全局作用域中执行的,因此函数中this 的值在非严格模式下指向window 对象,在严格模式下是undefined。
4)、间歇调用的方法是setInterval(),它接受的参数与setTimeout()相同:要执行的代码(字符串或函数)和每次执行之前需要等待的毫秒数。
5)、clearInterval()方法用来取消间歇调用。
栗子: var num = 0;
var max = 10;
var intervalId = null;
function incrementNumber() {
num++;
//如果执行次数达到了max 设定的值,则取消后续尚未执行的调用
if (num == max) {
clearInterval(intervalId);
alert("Done");
}
}
intervalId = setInterval(incrementNumber, 500);
6)、实际开发中一般用超时调用来模拟间接调用,因为后一个间歇调用可能会在前一个间歇调用结束之前启动。
栗子: // 倒计时
(function(k) {
var fc = arguments.callee;
setTimeout(function() {
if (k > 0) {
k--;
fc(k);
console.log("set" + k);
}
}, 1000);
})(10);
8.1.7 系统对话框
1)、浏览器通过alert()、confirm()和prompt()方法可以调用系统对话框向用户显示消息。
栗子: a、 alert("hellow word");
b、 if(confirm("hellow word")){
alert("OK");
}else{
alert("no OK");
}
c、 var result = prompt("What is your name? ", "");
if (result !== null) {
alert("Welcome, " + result);
}
2)、window.print(); // 显示"打印"对话框
window.find(); // 显示"查找"对话框
8.2 location 对象
1)、location 对象提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能。它既是window对象的属性也是document对象的属性,也就是window.location和document.location引用的是同一对象。
2)、location 对象的所有属性:
属性名 栗子 说明
hash "#contents" 返回URL中的hash(#号后跟零或多个字符),如果URL中不包含散列,则返回空字符串
host "www.wrox.com:80" 返回服务器名称和端口号(如果有)
hostname "www.wrox.com" 返回不带端口号的服务器名称
href "http:/www.wrox.com" 返回当前加载页面的完整URL。而location对象的toString()方法也返回这个值
pathname "/WileyCDA/" 返回URL中的目录和(或)文件名
port "8080" 返回URL中指定的端口号。如果URL中不包含端口号,则 这个属性返回空字符串
protocol "http:" 返回页面使用的协议。通常是http:或https:
search "?q=javascript" 返回URL的查询字符串。这个字符串以问号开头
8.2.1 查询字符串参数
8.2.2 位置操作
1)、assign()方法立即打开新URL 并在浏览器的历史记录中生成一条记录。
2)、location 对象的hash、search、hostname、pathname 和port 属性设置为新值来也会改变URL,同时也会在历史记录中生成一条新记录。
3)、replace()方法接受一个URL地址,但不会在历史记录中生成新记录。
4)、reload()方法作用是重新加载当前显示的页面。会以最有效的方式重新加载(若页面没有改变则从缓存中加载),如果需要强制从服务器加载则用location.reload(true)。
8.3 navigator 对象
1)、navigator 对象已经成为识别客户端浏览器的事实标准。
2)、
8.3.1 检测插件
8.3.2 注册处理程序
8.4 screen 对象
1)、screen 对象基本上只用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息。
8.5 history 对象
1)、history 对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。
2)、go()方法可以在用户的历史记录中任意跳转,可以向后也可以向前。这个方法接受一个参数,表示向后或向前跳转的页面数的一个整数值。
3)、back()和forward()模仿浏览器的“后退”和“前进”按钮。
4)、history 对象还有一个length 属性,保存着历史记录的数量。
九、 客户端检测
9.1 能力检测
1)、能力检测:在编写代码之前先检测特定浏览器的能力。例如,脚本在调用某个函数之前,可能要先检测该函数是否存在。这种检测方法将开发人员从考虑具体的浏览器类型和版本中解放出来,让他们把注意力集中到相应的能力是否存在上。能力检测无法精确地检测特定的浏览器和版本。
9.2 怪癖检测
1)、怪癖检测(quirks detection):怪癖实际上是浏览器实现中存在的bug,例如早期的WebKit 中就存在一个怪癖,即它会在for-in 循环中返回被隐藏的属性。怪癖检测通常涉及到运行一小段代码,然后确定浏览器是否存在某个怪癖。由于怪癖检测与能力检测相比效率更低,因此应该只在某个怪癖会干扰脚本运行的情况下使用。怪癖检测无法精确地检测特定的浏览器和版本。
9.3 用户代理检测
1)、通过检测用户代理字符串来识别浏览器(navigator.userAgent 属性可以查看用户代理字符串)。用户代理字符串中包含大量与浏览器有关的信息,包括浏览器、平台、操作系统及浏览器版本。用户代理字符串有过一段相当长的发展历史,在此期间,浏览器提供商试图通过在用户代理字符串中添加一些欺骗性信息,欺骗网站相信自己的浏览器是另外一种浏览器。用户代理检测需要特殊的技巧,特别是要注意Opera会隐瞒其用户代理字符串的情况。即便如此,通过用户代理字符串仍然能够检测出浏览器所用的呈现引擎以及所在的平台,包括移动设备和游戏系统。
2)、以下为完整的用户代理字符串检测脚本,包括检测呈现引擎、平台、Windows 操作系统、移动设备和游戏系统。
var client = function() {
//呈现引擎
var engine = {
ie: 0,
gecko: 0,
webkit: 0,
khtml: 0,
opera: 0,
//完整的版本号
ver: null
};
//浏览器
var browser = {
//主要浏览器
ie: 0,
firefox: 0,
safari: 0,
konq: 0,
opera: 0,
chrome: 0,
//具体的版本号
ver: null
};
//平台、设备和操作系统
var system = {
win: false,
mac: false,
x11: false,
//移动设备
iphone: false,
ipod: false,
ipad: false,
ios: false,
android: false,
nokiaN: false,
winMobile: false,
//游戏系统
wii: false,
ps: false
};
//检测呈现引擎和浏览器
var ua = navigator.userAgent;
if (window.opera) {
engine.ver = browser.ver = window.opera.version();
engine.opera = browser.opera = parseFloat(engine.ver);
} else if (/AppleWebKit\/(\S+)/.test(ua)) {
engine.ver = RegExp["$1"];
engine.webkit = parseFloat(engine.ver);
//确定是Chrome 还是Safari
if (/Chrome\/(\S+)/.test(ua)) {
browser.ver = RegExp["$1"];
browser.chrome = parseFloat(browser.ver);
} else if (/Version\/(\S+)/.test(ua)) {
browser.ver = RegExp["$1"];
browser.safari = parseFloat(browser.ver);
} else {
//近似地确定版本号
var safariVersion = 1;
if (engine.webkit < 100) {
safariVersion = 1;
} else if (engine.webkit < 312) {
safariVersion = 1.2;
} else if (engine.webkit < 412) {
safariVersion = 1.3;
} else {
safariVersion = 2;
}
browser.safari = browser.ver = safariVersion;
}
} else if (/KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)) {
engine.ver = browser.ver = RegExp["$1"];
engine.khtml = browser.konq = parseFloat(engine.ver);
} else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
engine.ver = RegExp["$1"];
engine.gecko = parseFloat(engine.ver);
//确定是不是Firefox
if (/Firefox\/(\S+)/.test(ua)) {
browser.ver = RegExp["$1"];
browser.firefox = parseFloat(browser.ver);
}
} else if (/MSIE ([^;]+)/.test(ua)) {
engine.ver = browser.ver = RegExp["$1"];
engine.ie = browser.ie = parseFloat(engine.ver);
}
//检测浏览器
browser.ie = engine.ie;
browser.opera = engine.opera;
//检测平台
var p = navigator.platform;
system.win = p.indexOf("Win") == 0;
system.mac = p.indexOf("Mac") == 0;
system.x11 = (p == "X11") || (p.indexOf("Linux") == 0);
//检测Windows 操作系统
if (system.win) {
if (/Win(?:dows )?([^do]{2})\s?(\d+\.\d+)?/.test(ua)) {
if (RegExp["$1"] == "NT") {
switch (RegExp["$2"]) {
case "5.0":
system.win = "2000";
break;
case "5.1":
system.win = "XP";
break;
case "6.0":
system.win = "Vista";
break;
case "6.1":
system.win = "7";
break;
default:
system.win = "NT";
break;
}
} else if (RegExp["$1"] == "9x") {
system.win = "ME";
} else {
system.win = RegExp["$1"];
}
}
}
//移动设备
system.iphone = ua.indexOf("iPhone") > -1;
system.ipod = ua.indexOf("iPod") > -1;
system.ipad = ua.indexOf("iPad") > -1;
system.nokiaN = ua.indexOf("NokiaN") > -1;
//windows mobile
if (system.win == "CE") {
system.winMobile = system.win;
} else if (system.win == "Ph") {
if (/Windows Phone OS (\d+.\d+)/.test(ua)) {;
system.win = "Phone";
system.winMobile = parseFloat(RegExp["$1"]);
}
}
//检测iOS 版本
if (system.mac && ua.indexOf("Mobile") > -1) {
if (/CPU (?:iPhone )?OS (\d+_\d+)/.test(ua)) {
system.ios = parseFloat(RegExp.$1.replace("_", "."));
} else {
system.ios = 2; //不能真正检测出来,所以只能猜测
}
}
//检测Android 版本
if (/Android (\d+\.\d+)/.test(ua)) {
system.android = parseFloat(RegExp.$1);
}
//游戏系统
system.wii = ua.indexOf("Wii") > -1;
system.ps = /playstation/i.test(ua);
//返回这些对象
return {
engine: engine,
browser: browser,
system: system
};
}();
标签:
原文地址:http://www.cnblogs.com/gaozejie/p/5167069.html