其实我本来想起的标题名字是为什么前端面试都要问闭包或当面试官问我闭包时,想了解什么,但是我又无法给出回答,怕别人为了寻找答案,点进来发现被欺骗了,这样可不好。若是有看客能回答一下,那还真不错。
阮大大说闭包是能够读取其他函数内部变量的函数,我觉得这一句话就足以让我了解闭包了。网上将闭包的博文太多了,我贴点儿栗子吧,有助于自己对闭包的理解。
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);
//16
这是在网上看到的一道笔试题:问a、b、c分别输出什么
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; }
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1); c.fun(2); c.fun(3);
//undefined, 0, 0, 0
//undefined, 0, 1, 2
//undefined, 0, 1, 1
你做对了嘛?
第一个undefined,是o一开始没有传值,所以是undefined
a = { fun: function(m) { return fun(m,0); } }
a.fun(1) -> fun(1,0);
a.fun(2) -> fun(2,0);
a.fun(2) -> fun(3,0);
fun(0).fun(1) -> fun(1,0);
fun(0).fun(1).fun(2) -> fun(2,1);
fun(0).fun(1).fun(2).fun(3) -> fun(3,2);
c = {
fun: function(m) {
return fun(m,1);
}
}
c.fun(2) -> fun(2,1);
c.fun(3) -> fun(3,1);
看懂了么,如果没看懂,这儿有更详细的讲解http://developer.51cto.com/art/201511/498268.html
var name = 'global';
var obj = {
name : 'obj',
dose : function(){
this.name = 'dose';
return function(){
return this.name;
}
}
}
alert(obj.dose().call(this))
//'global'
你做对了嘛?
var aaa = obj.dose() -> return this.name
aaa.call(this) -> window.name
call(this)相当于将函数运行环境中的this对象替换成window
来,看看下面这个会输出什么呢?(这个题很经典,因为我曾经面试时遇到过!!)
<ul id="test">
<li>这是第一条alert(0);</li>
<li>这是第二条alert(1);</li>
<li>这是第三条alert(2);</li>
</ul>
<script type="text/javascript">
var elements = document.getElementById('test').querySelectorAll('li');
for (var i = 0; i < elements.length; i++) {
elements[i].onclick = function () {
alert(i);
}
}
</script>
//点击每一条都alert:2
click方法中的i是一直随着for循环累加的,它没有在i=0或者i=其他时,记录下这个值,所以alert出的是最后i的值2
先酱~等我遇到再慢慢积累,第三篇喽~坚持住~[我最棒!!]