> 咕笛老师:闭包是必会的一个知识点,虽然在实际开发中不一定能用的上,但是这种思想一定要清楚的。很多插件和组件都是基于闭包开发的。
>
**闭包函数:**
声明在一个函数中的函数,叫做闭包函数。
**闭包:**
内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
函数`A`内部有一个函数`B`,函数`B`可以访问到函数`A`中的变量,那么函数`B`就是闭包
**闭包的实质:**
是因为函数嵌套而形成的作用域链
**闭包的作用:**
匿名自执行函数、缓存、实现封装(主要作用)、实现面向对象中的对象
**/\* 例子 0\*/**
~~~
var person = function(){
//变量作用域为函数内部,外部无法访问
var name = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}();
print(person.name);//直接访问,结果为undefined
print(person.getName());
person.setName("a");
print(person.getName());
//得到结果如下:
undefined
default
a
~~~
**/\* 例子1 \*/**
~~~javascript
function funA(){
var a = 10;
// funA的活动对象之中;
return function(){
//匿名函数的活动对象;
alert(a);
}}
var b = funA();
b();
//10
~~~
**/\* 例子2 \*/**
~~~javascript
function outerFn(){
var i = 0;
function innerFn()
{
i++;
console.log(i);
}
return innerFn;
}
var inner = outerFn();
//每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址
inner();
inner();
inner();
var inner2 = outerFn();
inner2();
inner2();
inner2();
//1 2 3 1 2 3
~~~
**/\* 例子3 \*/**
~~~javascript
var i = 0;
function outerFn(){
function innnerFn(){
i++;
console.log(i);
}
return innnerFn;
}
var inner1 = outerFn();
var inner2 = outerFn();
inner1();
inner2();
inner1();
inner2();
//1 2 3 4
~~~
- js面试题
- 说一下自己常用的es6的功能?
- 页面渲染html的过程?
- 说一下事件代理?
- 说一下继承的几种方式及优缺点?
- 说一下闭包?
- 对JSONP的理解*
- 基本的数据类型有哪些?
- js程序题
- JS找字符串中出现最多的字符
- 数组去重怎么作?
- 变量提升的这道题你会吗
- 用一段代码思考this的指向问题
- 这些类型的typeof返回什么值?
- 怎样添加、移除、移动、复制、创建和查找节点?
- css面试题
- css水平、垂直居中的写法,请至少写出4种
- 1rem、1em、1vh、1px各自代表的含义?
- 说一下盒模型?
- 清除浮动的几种方式,及原理?
- b与strong的区别?
- img中的alt与title属性?
- 浏览器兼容性
- IE6的BUG你都遇过哪些?怎么解决的?
- html面试题
- 对HTML结构语义化的理解?
- 前端工程化面试题
- webpack
- export和export default的区别?
- VueJs面试题
- 基础
- 生命周期
- vue路由(vue-router)
- 状态管理(vuex)
- axios
- vue-cli框架
- 前端架构面试题
- HTTP
- get、post的区别
- 你所知道的http的响应码及含义?