<script type="text/javascript">
/**
* 在js中当进行函数的调用,会为每一个函数增加一个属性SCOPE,通过这个属性来指向一块内存
* 这块内存中包含有所有的上下文使用的变量,当在某个函数中调用了新函数之后,新函数依然
* 会有一个作用域来执行原有的函数的SCOPE和自己新增加的SCOPE,这样就形成一个链式结构
* 这就是js中的作用域链
*/
var color = "red";
var showColor = function() {
alert(this.color);
}
function changeColor() {
var anotherColor = "blue";
function swapColor() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColor();
}
changeColor();
showColor();
</script>
如何理解:
changeColor() 函数可以访问作用域: global scope changeColor scope自己作用域
swapColor() 函数可以访问作用域: global scope changeColor scope外层函数、和swapColor scope作用域
*** 如何某一个变量在当前函数中没有,那么会去上一层函数中找变量
=========================================================================================
var fn2= function(){
var name="xiaoing"
alert("f2");
}
// 如何理解,在内存中创建一块区域,然后通过f2这个变量指向这块内存区域, 这块区域的函数开始是没有名称的
,这种函数可以叫做匿名函数
/**
* 1.Js中闭包:
* 执行compareObjectFunction 函数以后,理论上形参 prop 里面的函数 在栈中 都会被内存释放
* 但是 返回匿名函数,作用域扩大,内存不会被释放
* 通过返回函数来扩大作用域的方法就是闭包
*/
function compareObjectFunction(prop){
// 这个就是匿名函数,return 返回的
return function(obj1,obj2){
if(obj1[prop]>obj2[prop]){
return 1;
}else if(obj1[prop] == obj2[prop]){
return 0;
}else {
return -1;
}
}
}
var o1={name:"any",age:34};
var o2={name:"tony",age:1};
var compare= compareObjectFunction("name");
console.info("闭包结果是:",compare(o1,o2));