一、闭包
闭包是通过将函数从一个函数内部返回到函数外部成为一个全局变量,使得函数内部的变量可以在函数外部访问
1.1 闭包方式1:通过全局变量到函数中获取内部函数(不常用)
// 闭包1(潜入法)
var me; //全局变量
function Lihua_home(){
// 局部变量
var tv='电视机';
var wash='洗衣机';
var desk='桌子';
// 内部函数
var father=function(){
};
var mother=function(){
};
var borther=function(){
};
var lihua=function(){
};
me=function(){
return tv;
/*
return tv;放在内部函数中的作用是:
函数运行完毕不会回收tv变量,
因为tv变量还被其他函数使用
*/
};
}
// 访问函数
Lihua_home();
// 在函数外部访问局部变量
console.log(me);
// 取出局部变量
var ds=me();
console.log(ds);
1.2 闭包方式2(常用)
// 闭包2
function Lihua_home2(){
// 局部变量
var tv='电视机';
var wash='洗衣机';
var desk='桌子';
// 内部函数
function father(){
};
function mother(){
};
function borther(){
};
return function(){
return wash;
};
}
// 调用函数
var me2=Lihua_home2();
var xyj=me2();
console.log(xyj);
二、函数调用感知
在函数中可以使用当前函数名.caller来获取调用当前函数的函数,即让函数知道谁调用了自己。可以用arguments.callee.caller来获取(防止函数改变,同递归)
// 函数调用感知
function hello(){
if(arguments.callee.caller==zhangsan){ //如果张三调用
console.log('你好'); //陌生人
}else if(arguments.callee.caller==lisi){ //如果李四调用
console.log('吃了没'); //熟人
}
}
// 张三遇到陌生人
function zhangsan(){
hello();
}
zhangsan();
// 李四遇到熟人
function lisi(){
hello();
}
lisi();