JavaScript技巧总结和本地存储(一)
- 类型检测
typeof 一般用于js的基本数据类型(undefined,number,string,boolean。注意null检测的结构是object)检测,引用类型检测不准确。
instanceof 用于检测构造函数,一般引用类型数据类型检测可以检测出来,数组一般是用这种检测方式。但如果页面嵌套的比如iframe,这种检测也会出错。
Object.prototype.toStirng.call(检测的变量)这种检测方式是最不容易出错的。
- 作用域安全的构造函数
一般我们用js声明一个类是这样声明的:
function Student(name,age){
this.name=name;
this.age=age;
}
var stu=new Student (“li lei”,20);
如果直接调用Student函数时this直接指向window对象,这样会导致name和age都声明到全局变量中,导致全局变量的污染。为了避免这种危险性,构建作用域安全构造函数,先判断this的类型。
function Student(name,age){
if(this instanceof Student){
this.name=name;
this.age=age;
} else{
return new Student (name,age)
}
}
这样直接调用Student函数返回的也是实例的对象。这种写法也有个问题,在继承类的时候要用call来调用父类的构造函数,但由于this指向的是子类导致this instanceof Student为false。
function Stu(){
Student.call(this,’name’,22);
}
解决方案是用原型继承:
Stu.prototype=new Student(‘name’,22);
但如果Stu的参数要作为Student的参数可以这么写:
function Stu(name,age){
Student.apply(this,arguments)
}
Stu.prorotype= new Student(‘name’,22);
这里把Stu原型指向Student所以Stu实例对象instanceof Stu和Student都为true。
这点其实在jQuery源码中也是这么声明jQuery函数的。因为jquery是new jquery()和jquery()都返回对象。代码如下
var aQuery = function(selector, context) {
return new aQuery.prototype.init();
}
aQuery.prototype = {
init: function() {
this.age = 18
return this;
},
name: function() {},
age: 20
}
但返回的对象要有init构造函数以及name方法。那么就要加一句:
var aQuery = function(selector, context) {
return new aQuery.prototype.init();
}
aQuery.prototype = {
init: function() {
return this;
},
name: function() {
return this.age
},
age: 20
}
aQuery.prototype.init.prototype = aQuery.prototype;
console.log(aQuery().name()) //
- 函数绑定
就是在改变函数的this指向,传统的用法是call或者apply。Es5中可以用bind
- 柯里化
之前介绍过,这里不做过多介绍
- 定时器
使用setTimeout() 和setInterval()创建的定时器可以用于实现有趣且有用的功能,这里有个注意的点:定时器不是在规定的时间就会运行,而是在规定的时间将这个函数放入到异步队列中(包括单击事件的触发都会加入到这个队列中)当进程空闲下来才执行队列中的代码。
除了主JavaScript执行进程外,还有一个需要在进程下一次空闲时执行的代码队列,随着页面的在其生命周期中的推移,代码会按照执行顺序添加入队列,例如,当某个按钮被按下时,他的事件处理程序代码就会被添加到队列中,并在下一个可能的时间里执行,当接收到某个ajax响应时,回调函数的代码会被添加到队列,在JavaScript中没有任何代码是立刻执行的,但一旦进程空闲则尽快执行。
定时器队列的工作方式是,当特定时间过去后将代码插入,注意,给队列添加代码并不意味着对它立刻执行,而只能表示它会尽快执行。设定一个150ms后执行的定时器不代表了150ms代码就立刻执行,它表示代码会在150ms后被加入到队列中,如果在这个时间点上,队列中没有其他东西,那么这段代码就会被执行,表面上看上去好像代码就在精确指定的时间上执行。其他情况下,代码可能明显等待更长时间才执行。
- 重复的定时器
使用setInterval()创建的定时确保了定时器代码规则地插入队列,这个方式的问题在于定时器代码可能在代码再次被添加发哦队列之前还没完成执行,结果导致定时器代码连续运行好几次,而之间没有任何停顿,幸好,JavaScript引擎够聪明,能避免这个问题,仅当没有该定时器的任何其他代码示例时,才将定时器代码添加发到队列中。
这种循环有两个问题:
1、 某些时间间隔会被跳过
2、 多个定时器执行之间的间隔可能会比预期的小。
为了避免这个两个问题,可以使用链式setTime()调用。
setTimeout(function(){
setTimeout(arguments.callee,interval);
})
这样可以保证在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。
- 数组分块
在数组循环处理复杂操作并且这段代码不影响后面的其他代码的单独存在,可以用定时器来推迟到进程空闲状态下在执行。避免js开始运行时间太长。逻辑写法和上面一样。
- 函数节流
有些函数或事件需要频繁调用执行的时候,为了优化性能,加入定时器在规定的时候内调用这个函数,那先把之前未执行的定时器取消,然后在重新设定定时器。这样函数的运行次数就少了很多。性能优化很多,vue的双向数据绑定,在数据驱动下,数据频繁改动导致频繁调用绑定视图函数,就是用函数节流的方式优化性能。
函数节流背后的基本思想是指,某些代码不可以在没有间断的情况连续重复执行,第一次调用函数,创建一个定时器,在指定时间间隔之后运行代码,当第二次调用该函数时,它会清除前一次的定时器并设置另一个,如果前一个定时器已经执行过了,这个操作就没有任何意义,基本形式是:
var processor={
timeoutId:null,
performProcessing:function(){},
process:function(){
clearTimeout(this.timeoutId);
this.timeoutId=setTimeout(function(){
that.performProcessing();
},100);
}
}
(二):自定义事件、拖放、添加自定义事件、离线应用和客户存储
JavaScript技巧总结和本地存储(一)的更多相关文章
- JavaScript技巧总结和本地存储(二)
离线检测 检测是否离线,html5为此定义了一个navigator.onLine属性,这个属性为true表示设备能上网,false表示离线,这个属性还有点兼容问题.因此单独使用这个属性不能确定网络是否 ...
- JavaScript:浏览器的本地存储
cookie.localStorage.sessionStorage的使用 <!DOCTYPE html> <html lang="en"> <hea ...
- HTML5 学习总结(三)——本地存储
一.HTML4客户端存储 B/S架构的应用大量的信息存储在服务器端,客户端通过请求响应的方式从服务器获得数据,这样集中存储也会给服务器带来相应的压力,有些数据可以直接存储在客户端,传统的Web技术中会 ...
- HTML5 学习笔记(三)——本地存储
目录 一.HTML4客户端存储 1.1.提交表单发送到服务器的信息 1.2.客户端本地存储概要 二.localStorage 2.1.添加 2.2.取值 2.3.修改 2.4.删除 2.5.跨页面与跨 ...
- HTML5 学习笔记(三)——本地存储(LocalStorage、SessionStorage、Web SQL Database)
一.HTML4客户端存储 B/S架构的应用大量的信息存储在服务器端,客户端通过请求响应的方式从服务器获得数据,这样集中存储也会给服务器带来相应的压力,有些数据可以直接存储在客户端,传统的Web技术中会 ...
- HTML5 ——本地存储
目录 一.HTML4客户端存储 1.1.提交表单发送到服务器的信息 1.2.客户端本地存储概要 二.localStorage 2.1.添加 2.2.取值 2.3.修改 2.4.删除 2.5.跨页面与跨 ...
- HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)
HTML5问世以后,前端加入了一个重要的功能,便是本地存储,本地存储可分为4类: Local Storage:总的存储量有所限制,并不能提供真正的检索API,数据的生命期比窗口或浏览器的生命期长,数据 ...
- web前端实现本地存储
当我们在提及web前端本地存储的时候,首先需要介绍一下本地化存储的概念和历史.本地化存储从来不是一个新奇的概念,因为web应用程序一直在追求的就是媲美甚至超越桌面应用程序.但是桌面应用程序一直优于we ...
- Javascript本地存储小结
前言 总括:详细讲述Cookie,LocalStorge,SesstionStorge的区别和用法. 人生如画,岁月如歌. 原文博客地址:Javascript本地存储小结 知乎专栏&& ...
随机推荐
- javaweb入门实例---servlet例子
1.编写servlet: TreeDataServlet.java package com.maggie.tree; import java.io.IOException; import javax. ...
- Spring mvc基本原理
http://blog.csdn.net/xtu_xiaoxin/article/details/8796499 http://www.cnblogs.com/wawlian/archive/2012 ...
- 关于redis的主从、哨兵、集群
关于redis主从.哨兵.集群的介绍网上很多,这里就不赘述了. 一.主从 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重 ...
- HDU5692(线段树+dfs序)
Snacks Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- Redis key 相关命令
其实本质上,Redis 就是一个Key---Value 数据库.这里我先介绍下Redis中关于的key的相关命令, 注意:key是字符串存储,但是不能使用 空格 或者 “\n”,value 则可以使用 ...
- LinQ 创建连接、简单增删改查
LINQ--语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操 ...
- Livy原理详解
Livy的概述(引自社区) Livy(当前是alpha版本)是一个提供rest接口和spark集群交互的服务.它可以提交spark job或者spark一段代码,同步或者异步的返回结果:也提供spar ...
- Robot Framework和Selenium 2 Grid集成指南
1. 环境搭建 A. 所需软件 1. Selenium2Lib 1.0.1 这个特性需要用到Selenium2Lib的最新版本1.0.1,但是这个版本还有一些iframe支持和IE支持的问题需要修改, ...
- Mrc.EOF
Mrc 是我们定义的一个变量,用来存放数据等同于 ADODB.Recordset而eof 是mrc也就是recordset的一个属性. 通常我们在程序中编写代码来检验BOF与EOF属性,从而得知目前指 ...
- udp 双机通信(服务器循环检测)2
此文摘自:http://blog.csdn.net/qinpeng100423/article/details/8980423,谢谢了 自己上一篇写的udp通信,只能运行一次,参考了这位博主的,只是把 ...