JavaScript 高级程序设计(第3版)学习笔记
文章平均质量分 68
JavaScript 高级程序设计(第3版)学习笔记
仰望星空的代码
专注Web前端和微信小程序开发。
展开
-
第一章JavaScript简介
JavaScript 实现虽然 JavaScript 和 ECMAScript 通常都被人们用来表达相同的含义,但 JavaScript 的含义却比 ECMA-262 中规定的要多得多。没错,一个完整的 JavaScript 实现应该由下列三个不同的部分组成(见图1-1)。核心(ECMAScript)文档对象模型(DOM)浏览器对象模型(BOM)原创 2018-01-10 18:06:49 · 332 阅读 · 0 评论 -
利用navigator对象检测插件
navigator对象是所有支持 JavaScript 的浏览器所共有的一个BOM对象。navigator对象包含appCodeName、appName、userAgent、plugins等很多非常有用的属性。检测浏览器中是否安装了特定的插件是一种最常见的检测例程。对于非 IE 浏览器,可以使用plugins数组来达到这个目的。该数组中的每一项都包含下列属性。 name:插件的名字。 ...原创 2018-08-07 16:01:02 · 1326 阅读 · 0 评论 -
客户端检测(浏览器,操作系统,平台)
用户代理字符串检测脚本,包括检测呈现引擎、平台、Windows 操作系统、移动设备和游戏系统。var client = function(){ //呈现引擎 var engine = { ie: 0, gecko: 0, webkit: 0, khtml: 0, opera: 0, ...原创 2018-08-08 10:02:43 · 2222 阅读 · 0 评论 -
JavaScript的闭包与变量
闭包总是搞不清匿名函数和闭包这两个概念,因此经常混用。闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数,以createComparisonFunction()函数为例,注意加粗的代码。function createComparisonFunction(propertyName) { return function(object...原创 2018-08-13 20:05:52 · 1797 阅读 · 0 评论 -
在 HTML 中指定事件处理程序(事件侦听器)的部分缺点
如下代码,在指定的事件处理程序(事件侦听器)中是可以直接访问form中的元素的属性的。<form method="post"> <input type="text" name="username" value=""> <input type="button" value="Echo Username"原创 2018-08-18 16:16:28 · 402 阅读 · 0 评论 -
表单脚本(一):以编程方式提交表单和解决重复提交表单
提交表单用户单击提交按钮或图像按钮时,就会提交表单。使用<input>或<button>都可以定义提交按钮,只要将其type特性的值设置为"submit"即可,而图像按钮则是通过将<input>的type特性值设置为"image"来定义的。因此,只要我们单击以下代码生成的按钮,就可以提交表单。<!-- 通用提交按钮 --><inpu原创 2018-08-31 14:11:40 · 588 阅读 · 0 评论 -
跨浏览器处理 XML
一、解析XML很少有开发人员能够有福气专门针对一款浏览器做开发。因此,编写能够跨浏览器处理 XML 的函数就成为了常见的需求。对解析 XML 而言,下面这个函数可以在所有四种主要浏览器中使用。function parseXml(xml){ var xmldom = null; if (typeof DOMParser != "undefined"){ ...原创 2018-11-14 20:21:32 · 273 阅读 · 0 评论 -
数据存储——cookie
一、前言随着 Web 应用程序的出现,也产生了对于能够直接在客户端上存储用户信息能力的要求。想法很合乎逻辑,属于某个特定用户的信息应该存在该用户的机器上。无论是登录信息、偏好设定或其他数据,Web 应用提供者发现他们在找各种方式将数据存在客户端上。这个问题的第一个方案是以 cookie 的形式出现的,cookie 是原来的网景公司创造的。一份题为“Persistent Client State...原创 2018-11-27 10:58:08 · 1479 阅读 · 0 评论 -
JavaScript:检测浏览器中的插件
一、前言一个浏览器安装了什么插件,有没有安装这个插件等等可以通过js进行检测得到,有助于一些依赖特定插件的场景的实现和处理。二、实现//检测所有浏览器中的插件function hasPlugin(pluginName,IEPluginName){ var result = hasPlugin(pluginName); if (!result){ re...原创 2018-12-22 13:55:24 · 1448 阅读 · 4 评论 -
利用location对象获取查询字符串
通过location的属性可以访问到location对象的大多数信息,但其中访问 URL 包含的查询字符串的属性并不方便。尽管location.search返回从问号到 URL 末尾的所有内容,但却没有办法逐个访问其中的每个查询字符串参数。为此,可以像下面这样创建一个函数,用以解析查询字符串,然后返回包含所有参数的一个对象:function getQueryStringArgs(){ ...原创 2018-08-07 15:32:01 · 889 阅读 · 0 评论 -
JavaScript的间歇调用和超时调用
JavaScript 是单线程语言,但它允许通过设置超时值和间歇时间值来调度代码在特定的时刻执行。前者是在指定的时间过后执行代码,而后者则是每隔指定的时间就执行一次代码。超时调用需要使用window对象的setTimeout()方法,它接受两个参数:要执行的代码和以毫秒表示的时间(即在执行代码前需要等待多少毫秒)。其中,第一个参数可以是一个包含 JavaScript 代码的字符串(就和在eva...原创 2018-08-07 15:14:32 · 512 阅读 · 0 评论 -
js中的call、apply、bind的作用、应用场景与区别
一、call、apply的作用与应用每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。首先,apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array的实例,也可以是arguments对象。例如:function sum(num1, ...原创 2018-07-19 20:35:18 · 3024 阅读 · 0 评论 -
js中的字符串操作方法
一、concatconcat(),用于将一或多个字符串拼接起来,返回拼接得到的新字符串。先来看一个例子。var stringValue = "hello ";var result = stringValue.concat("world");alert(result); //"hello world"alert(stringValue); //"...原创 2018-07-20 11:15:14 · 1934 阅读 · 0 评论 -
js设计模式:简单而不完美的构造函数模式
构造函数模式ECMAScript 中的构造函数可用来创建特定类型的对象。像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中。也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。例如,使用构造函数模式如下。function Person(name, age, job){ this.name = name; this.age = age;...原创 2018-07-30 20:45:12 · 487 阅读 · 0 评论 -
js设计模式:属性共享的原型模式
原型模式我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。换句话说,不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添...原创 2018-07-31 14:29:10 · 1082 阅读 · 0 评论 -
js设计模式:组合使用构造函数模式和原型模式
组合使用构造函数模式和原型模式创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度地节省了内存。另外,这种混成模式还支持向构造函数传递参数;可谓是集两种模式之长。代码例子。function Person(name, age, jo...原创 2018-07-31 15:11:11 · 416 阅读 · 0 评论 -
js设计模式:动态原型模式
动态原型模式有其他 OO 语言经验的开发人员在看到独立的构造函数和原型时,很可能会感到非常困惑。动态原型模式正是致力于解决这个问题的一个方案,它把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),又保持了同时使用构造函数和原型的优点。换句话说,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。来看一个例子。function Person(na...原创 2018-07-31 15:21:18 · 509 阅读 · 0 评论 -
js设计模式:寄生构造函数模式
寄生构造函数模式通常,在前述的几种模式都不适用的情况下,可以使用寄生(parasitic)构造函数模式。这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象;但从表面上看,这个函数又很像是典型的构造函数。下面是一个例子。function Person(name, age, job){ var o = new Object(); o...原创 2018-07-31 15:32:11 · 609 阅读 · 0 评论 -
JavaScript:递归
递归递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示。function factorial(num){ if (num <= 1){ return 1; } else { return num * factorial(num-1); }}这是一个经典的递归阶乘函数。虽然这个函数表面看来没什么问题,但下面的代码...原创 2018-08-01 16:49:14 · 1020 阅读 · 0 评论 -
JavaScript:事件处理
function EventUtil() { /** * 添加(注册)事件 * @param {element object} element 元素/标签名 * @param {string} eventType 事件名,如'click' * @param {function} handler 响应事件的函数 */ this.addHandler = fun...原创 2018-12-22 16:40:41 · 145 阅读 · 0 评论