闭包与递归
2019-12-12 本文已影响0人
又菜又爱分享的小肖
1.什么是闭包
搞这些只为提高自己的记忆力,以后会不定期的发布
声明在函数内部,可以访问函数内部的局部变量的一个函数
01.第一种表现形式
function test(){
var num = 10;
function test2(){
console.log(num);
}
return test2;
}
var fn = test(); //调用test函数,有一个返回值,返回值是函数.
fn();//那调用fn其实就是在调用这个test2
02.第二种表现形式
var fn2 = (function(){
var num1 = 100;
function inner(){
console.log(num1);
}
return inner;
}());
fn2(); //这里调用fn2本质上也是在调用inner
2.闭包的作用?
01.提升变量的生命周期
就是说可以在函数外部访问函数内部的局部变量
//局部变量:从声明他开始到那个函数执行完毕,结束啦
//全局变量:从声明出来开始,到程序结束(页面关闭)
function test(){
var num=10;
console.log('嘻嘻');//嘻嘻
console.log('爱你');//爱你
console.log(num);//10
console.log('嘿嘿')//嘿嘿
}
test();
console.log(num)//报错了,因为该变量被回收了
//提升变量的生命周期
function test(){
var num=10;
function test2(){
console.log(num);
}
return test2;
}
var ha=test();//test()相当于test2函数,赋值给ha
ha();//相当于调用test2函数
02.提供有限的访问权
03.设置私有属性
3.沙箱/沙盒
01.作用:分割作用域,避免全局变量污染 模块化开发
var list=[];
function Boss(){
}
//为什么不能在这个自执行函数里面直接使用window,而是非要传参进来使用??
//1.直接使用会破坏函数的封装性
//2.代码上线之前会有代码压缩,为了避免压缩过程中出问题
w.Boss=Boss;
w.Boss1=Boss1;
}(window));
4.函数执行的三种方式-this的指向
口诀:不要管函数/方法是如何声明的,要看函数/方法是如何调用,谁调用,里面的this就是谁
1.作为普通函数调用--this指向window
function test(){
console.log('test');
console.log(this);
}
test();//指向window
snipaste_20191212_201712.png
2.作为方法调用--指向obj对象
var num='数字';//声明一个全局变量,本质上相当于给window对象添加一个属性
var obj={
name:'家家',
sayHi:function(){
console.log('哈哈哈');
console.log(this);
}
}
obj.sayHi();//调用
snipaste_20191212_202203.png
3.作为构造函数调用
function Student(name, age) {
this.name = name;
this.age = age;
console.log(this);
}
//3.1 构造函数配合new关键字调用,this是new关键字创建出来的对象.
var s1 = new Student('加哥',20);
//3.2
Student('哈哈',66); //相当于是window.Student('哈哈',66)
snipaste_20191212_202812.png
2.什么是递归?
1.函数在函数内部调用自己
注意:一定要有结束的条件,不然无意义
//在函数内部直接调用自己
function test(){
console.log('嘿嘿');
test();//调用自己
}
test();
//函数内部间接调用函数自己
function test1(){
console.log('test1');
test2();//test1里面调用test2
}
function test2(){
console.log('test2');
test1();//test2里面又调用test1,那就感觉test1里面调用test1
}
test1();
//注意: 递归结束的时候,要有条件结束
let i = 0;
function test(){
i++;
console.log('哈哈');
if(i < 3){
test();//当i小于3的时候才会继续在test函数中调用test函数.
}
}
test();
2.递归的执行过程
let i=0;//声明全局变量
function test(){
i++;
console.log('哈哈'+i)
if(i<3){//条件为小于3结束
test();//调用自己
}
console.log('呵呵'+i);
}
test();
结果:
snipaste_20191212_204012.png
过程:
递归执行过程01.png