闭包
一、概念
字面意思:封闭和包裹
函数中:它会形成一个封闭包裹的环境,函数内部声明的变量函数外部无法访问到。
闭包:计算机科学中定义的闭包,函数本身以及函数所处的环境(作用域链)构成的一个综合体叫做闭包。函数就是闭包,函数会形成一个闭包。
二、函数基础回顾
1、如果一个函数没有返回值,此时获取函数的返回值是:undefined。
2、如果一个函数有返回值:
如果return后面什么都没有,此时返回值是:undefined;
返回值的类型可以是:string number boolean array object……
3、为什么要返回值:就是要获取函数内部声明的变量
4、为什么不在全局环境声明一个变量,而是在函数体内部声明,
三、闭包要解决的问题:在函数外部访问函数内部的内容
四、缓存
作用:
思路:计算的时候先去容器里面查询一下是否有这个数字对应的值,如果有,直接拿过来用,如果没有,先计算,计算完成后存到容器中去
1、CDN:内容分发网络
练习题
1、用自己的话简述属性 和 变量 的搜索原则
属性搜索原则:
先在对象本身找,再去原型中找,如果找不到就undefined。
变量搜索原则:
首先在当前链上找:如果有则停止查找;如果没有在n-1级上找(在函数内部允许访问定义在函数外部的变量);
如此往复,直到0级链
如果找到,则结束寻找,直接获得该链接上变量的数据,如果还没有抛出异常。
2、什么是静态成员?什么是实例成员
静态成员:和构造函数相关的属性或方法;实例成员:由构造函数创造出来的对象相关
3、JavaScript中的作用域是_词法_作用域
4、怎么理解JavaScirpt中的作用域?__
Js中的作用域是词法作用域,在定义函数时就已经定义下来了。词法作用域的含义?
5、代码
var arr = [{name:"张三"},
{name:"李四"},
{name:"王五"},
{name:"赵钱"},
{name:"孙李"} ];
for (var i = 0; i < arr.length; i++) {
arr[i].show = function () {
console.log(arr[i].name);
};
}
// 根据以上代码分析以下情况的结果:
// 情况一:
for (var i = 0; i < arr.length; i++) {
arr[i].show();
// 正确的结果
}
的执行结果是多少?
结果:张三 李四 王五 赵钱孙李
// 情况二:
for (var j = 0; j < arr.length; j++) {
arr[j].show();
}
的执行结果是多少?
结果:报错
6、使用一句话总结什么是闭包?
一个封装包裹的环境。