其實我本來想起的標題名字是為什么前端面試都要問閉包或當面試官問我閉包時,想了解什么,但是我又無法給出回答,怕別人為了尋找答案,點進來發現被欺騙了,這樣可不好。若是有看客能回答一下,那還真不錯。
阮大大說閉包是能夠讀取其他函數內部變量的函數,我覺得這一句話就足以讓我了解閉包了。網上將閉包的博文太多了,我貼點兒栗子吧,有助於自己對閉包的理解。
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
先醬~等我遇到再慢慢積累,第三篇嘍~堅持住~[我最棒!!]
