闭包的练习
线程:一个线程一次只能处理一件事情,多个线程就可以多个事情同时进行
1 | //问题代码 |
JS是单线程的
JS中,分了三个任务
1.渲染任务
2.js的代码执行任务
3.事件处理任务
JS代码的执行顺序
1.先把主任务(代码任务)执行完毕
2.再去执行次要的任务(包括setTimeOut和setInterval中的回调函数中的代码)
setTimeOut
至少在指定的时间后执行指定回调函数
因为要等主任务中的代码执行完毕之后,才回去检查,setTimeOut的回调函数,有没到执行时间
用闭包来解决回调函数在调用的时候访问的是全局的变量
在闭包中创建一个变量,来单独存储当前的回调函数需要的数据,
在调用的时候就会去使用这个单独的数据,而不是去访问全局变量
闭包的练习2
1 | for (var i = 0; i < divs.length; i++) { |
注册点击事件的时候
点击事件在触发的时候访问的是全局的变量
在闭包中创建一个变量,来单独存储当前的事件处理函数需要的数据,
在调用的时候就会去使用这个单独的数据,而不是去访问全局变量
闭包练习3
1 | var arr = [{name: '张三1'}, |
缓存
缓存:cache
缓存的作用,就是将一些常用的数据,存储起来,提供使用,提升性
硬件缓存
浏览器缓存
CDN
内存型数据库
//数据库 高并发
//非关系型数据库(内存型数据库) MongoDB Redis
//网站静态页面缓存机制
//将网页静态化,存储在服务器端
如何用闭包实现缓存
1、写一个闭包在闭包中创建一个对象,用来做缓存的存储对象
2、在闭包中创建一个对象,用来做缓存的存储对象
3、在闭包中创建一个数组,用来存储换中的键
4、返回一个函数,这个函数需要两个参数,一个是key 一个是value
5、在返回的函数中,判断传入的value是否为undefined
6、如果为Undefined 则表示是获取值,就直接返回在第一步创建的缓存对象中指定的键对应的值
7、如果不为Undefined 则表示是设置值
8、在缓存对象中设置指定的key的值为value
9、把key加入存储key的数组
10、判断key数组是不是超出了缓存大小限制
11、如果超出限制,删除数组第一个元素(使用shift),获取到删除的key
12、使用删除的key删除缓存对象中存储的值(delete)
递归斐波那切数列的问题以及解决
使用数组存储数列,虽然可以提升性能,但是有局限性
可以求5的 也可以求10的,但是要求100呢 100000呢
定义一个缓存数组,存储已经计算出来的斐波那契数
1.先从cache数组中去取想要获取的数字
2.如果获取到了,直接使用
3.如果没有获取到,就去计算,计算完之后,把计算结果存入cache,然后将结果返回
创建缓存容器
1 | function createCache(){ |
jQuery缓存实现分析
1 | function createCache(){ |
沙箱模式
与外界隔绝的一个环境,外界无法修改该环境内任何信息,沙箱内的东西单独属于一个世界
360沙箱模式
将软件和操作系统进行隔离,以达到安全的目的
苹果手的app使用的就是沙箱模式去运行
//隔离app的空间,每个app独立运行
JS中的沙箱模式
沙箱模式的基本模型
1 | (function(){ |
沙箱模式一般应用在
书写第三方框架
或者为第三方框架书写插件
或者书写功能独立的一些组件
沙箱模式的优势
1.沙箱模式使用的是IIFE,不会再外界暴露任何的全局变量,也就不会造成全局变量污染
2.沙箱中的所有数据,都是和外界完全隔离的,外界无法对其进行修改,也就保证了代码的安全性
js中沙箱模式的实现原理就是
函数可以构建作用域!上级作用域不能直接访问下级作用域中的数据
函数调用的四种模式
1.函数模式
//this指向window全局对象
function test(){
console.log(this);
}
test();
2.方法模式
//this指向调用这个方法的对象
var obj1 = {
test:function(){
console.log(this);
}
}
obj1.test();
3.构造函数模式
//this 使用new创建出来的对象
function Person(){
console.log(this);
}
var obj =new Person();
4.上下文模式
上下文调用模式
JS中的上下文
1 | //context 执行环境的意思 |
使用如下两个方法,可以修改函数调用上下文,也就是this的值
apply
api文档中的语法语句中 [] 代表括起来的东西可有可无
函数.apply(对象, 函数需要参数列表,是一个数组)
call
函数.call(对象,arg1,arg2,arg3…argn)
call和apply的区别
1.第一个参数都是要把this修改成的对象
2.当函数需要参数的时候,那么apply是用数组进行参数的传递
3.而call是使用单个的参数进行传递
call用于确定了函数的形参有多少个的时候使用
apply用于函数的形参个数不确定的情况
构造函数调用模式特征
1.构造函数的首字母要大写
2.一般情况下和new关键字一起使用
3.构造函数中的this指定而是new关键字创建出来的对象
4.默认的返回new创建出来的这个对象
构造函数的返回值
默认返回new创建创建出来的对,若是值类型的数据,没有影响
若是对象类型,则返回这个对象,不会返回原来创建出来的对象
工厂模式的构造函数
1 | function Person(name,age){ |