`
编程足球
  • 浏览: 251080 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

javascript核心 -- function 之 闭包-经典案例

 
阅读更多
题目1
/*全局(window)域下的一段代码*/
function a(i) {
    var i;
    alert(i); 
};
a(10);
/*
	输出结果是: 10
	分析:
		a 函数有一个形参 i,调用 a 函数时传入实参 10,形参 i=10
		接着定义一个同名的局部变量 i,未赋值
		alert 输出 10
*/


题目2
function a(i) {
    alert(i);     
    alert(arguments[0]);
    var i = 2;
    alert(i);
    alert(arguments[0]);
};
a(10);

/*
	输出结果: 10,10,2,2
	分析:
		a 函数有一个形参i,调用 a 函数时传入实参 10,形参 i=10
		第一个 alert 把形参 i 的值 10 输出
		第二个 alert 把 arguments[0] 输出,应该也是 i
		接着定义个局部变量 i 并赋值为2,这时候局部变量 i=2
		第三个 alert 就把局部变量 i 的值 2 输出
		第四个alert再次把 arguments[0] 输出 
*/


题目3
/*全局(window)域下的一段代码*/
var i=10;
function a() {
    alert(i);
    var i = 2;
    alert(i);
};
a();
/*
	输出结果: undefined,2
	分析: js的预定义功能
*/



题目5
var i=10; 
function a() { 
    alert(i); 
    function b(){
        var i = 2; 
        alert(i);
    }
    
    b();
}; 
a();
/*
	输出结果: 10,2
	分析: 
             i的定义对于a来说,b定义的i是是私有的(比喻),
             a在查找变量a时候是一级级向上查找的,不会向下查找

*/



题目6
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}

checkscope();

function checkscope2(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}

checkscope2()();


/*
	输出结果: local scope,local scope
	分析: 
             checkscope();  局部变量作用于在函数里面都是通用的,
             checkscope2()(); f()依旧是绑定checkscope2(),checkscope2一样是存在
*/


题目7
// 数据统计1
var uniqueInteger = (function(){
    var counter = 0;
    return function(){
        return counter++;
    }  
}());
uniqueInteger();//0


// 数据统计2 通过对象
function counter(){
    var n = 0;
    return {
        count:function(){ return n++},
        reset:function(){ n=0;}
    };
}

var c = counter();
var d = counter();
c.count();//0
d.count();//0
c.reset();//
c.count();//0
d.count();//1
/*
     1.两个方法都可以访问私有变量n
     2.每次调用counter()都会创建一个   

                新的作用域链和一个新的私有变量
*/



题目8
function constfunc(v){
    return function(){
        return v;
    };
}

var funcs = [];
for(var i = 0;i<10;i++){
    funcs[i] = constfunc(i);
}

funcs[5]();//值是多少?

function constfunc(){
    var funcs = [];
    for(var i = 0;i<10;i++){
        funcs[i] = function(){return i;};
    } 
    return funcs;
}


var funcs = constfunc();
funcs[5]();// 值是多少?

/*
     结果:   5,10
     分析:   第一个funcs中的每个function都是new新的constfunc,处于不同的闭包
             第二个funcs中的每个function处于同一个闭包中,数据共享,都会返回相同的值
*/


具体可以查看javascript解析过程http://lingf.iteye.com/blog/1834909
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics