1.什么是原型链
当一个对象在查找一个属性的时,
自身没有,就会根据__proto__ 向它的原型进行查找,如果都没有,则向它的原型的原型继续查找,直到查到
Object.prototype._proto_为 nul,这样也就形成了原型链。
2.什么是作用域链
变量起作用的范围,就是变量的作用域
注意:在JS当中,有且只有函数可以创建作用域!!
在寻找变量的时候,在当前作用域中进行查找,如果找到了就使用,如果没有找到,就继续向上一级作用域中进
行查找,如果找到了就使用,如果还没有找到,就继续沿着作用域链向上查找,直到全局作用域
3.什么是闭包
闭包是一个封闭的隔离的空间,在js中表现为函数所构成的外部无法访问的区域,当函数被外部引用时,就创建了该函数的闭包
闭包的实质是一个函数,是一个用于返回局部变量值的函数,因为在全局中,受JavaScript链式作
用域结构的影响,父级变量中无法访问到子级的变量值,为了解决这个问题,才使用闭包这个概念。
闭包的特性:
①.封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口;
②.持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在
系统中,闭包中的数据依然存在,从而实现对数据的持久使用。
优点:
① 减少全局变量。
② 减少传递函数的参数量
③ 封装;
缺点:
使用闭包会占有内存资源,过多的使用闭包会导致内存泄露等.
//获得闭包中多个数据
function foo(){
var num1 = 1;
var num2 = 2;
return {
get_num1: function(){
return num1;
},
get_num2:function(){
return num2;
},
set_num1:function(value){
num1 = value;
}
}
}
var p = foo();
console.log(p.get_num1()) --1
console.log(p.get_num2()) --2
p.set_num1(5)
console.log(p.get_num1()) --5
//沙箱模式
沙箱模式就是立即执行函数表达式也叫自调用匿名函数
特点是没有函数名,在页面加载完成时就执行一次,且内部的变量不会被外界访问到,正好符合沙箱模式
1. //jq写法
(function () {
var Cat = {
eat:function () {
console.log("吃");
}
}
window.cat = window.$ = Cat;
})()
window.cat.eat();//吃
window.$.eat();//吃
cat.eat();//吃
$.eat();//吃
2.
<script>
//普通模式1
var num1 = 0;
for(var i = 1;i <= 100; i++)
{
num1 += i;
}
console.log(num1);//5050
//普通模式2
function test() {
var num2 = 0;
for(var i = 1;i <= 100; i++)
{
num2 += i;
}
console.log(num2);//5050
}
test();
//沙箱模式
(function () {
var num3 = 0;
for(var i = 1;i <= 100; i++)
{
num3 += i;
}
console.log(num3);//5050
})();
console.log(num1);//还可以打印5050
console.log(num2);//爆红,num2 is not defined ----说明函数里面的内容外面那不到
console.log(num3);//爆红,num3 is not defined ----说明沙箱里面的内容外面那不到
</script>
3.闭包来缓存
对象无法判断数据存储的顺序,需要用一个数组来帮助完成容量限制的操作
数组中存储数据的键,可以根据键的数量来判断容量是否超了
在超容之后,可以通过键的顺序知道哪个数据是最先加进来的,然后将其删除
function createCache(){
var cache = {};
var keys = [];
return{
setValue:function(key,value){
cache[key] = value;
keys.push(key);
判断所存数据的个数是否超过了限制
if (keys.length>3) {
//如果超过了,就把最前面的数据key删掉(数组和对象中都要删除)
var key =keys.shift();
delete cache[key];
}
},
getValue:function(key){
return cache[key] ;
}
}
}
var cache = createCache();
cache.setValue("帅哥","王建军")
cache.setValue("帅哥1","王建军")
cache.setValue("帅哥2","王建军")
cache.setValue("帅哥3","王建军")
console.log( cache.getValue("帅哥"))
网友评论