吃晚飯,洗個澡,然後繼續吧,今天看完這些,明天就能進入物件導向了,後面還有bom,dom,ajax還有好多需要看呢。剛剛真是慚愧,我還以為我看完函數那一章了呢。汗顏^^^
js函數剛開始的時候會對()有些不清楚。這邊分享一下:()有兩個作用:
1)分隔作用,function func(arg1,arg2){} var a = String(adwad); (1+2)*3
2)執行作用,var acc = func(); 這裡就是執行。
(function(){})(); 前面的小括弧指的分隔字元,最後的小括弧指的是立即執行,很優雅的寫法。
這在當你碰到在js中window.onload = init;和在body標籤中添加 onload = init();是一樣的效果。
就是函數調用和引用的區別,可以看有沒有小括弧。這個小知識點我覺得挺有用的,就寫在這了。
5.1 變數的作用範圍和生命週期
看一下下面這個有趣的代碼:重點是第二個輸出為什麼是undefined。
<script> var y =1;function getValue(){ document.write("局部變數y="+y+"<br />"); var y = 2; document.write("局部變數y="+y+"<br />");} document.write("全域變數y="+y+"<br />"); getValue(); document.write("全域變數y="+y+"<br />");</script>/*輸出全域變數y=1局部變數y=undefined局部變數y=2全域變數y=1*///相當於如下代碼:<script> var y =1;function getValue(){ var y ; document.write("局部變數y="+y+"<br />"); y = 2; document.write("局部變數y="+y+"<br />");} document.write("全域變數y="+y+"<br />"); getValue(); document.write("全域變數y="+y+"<br />");</script>//這就解釋了為什麼第二個y是undefined,因為javascript變數聲明提升,所以最上面的代碼在函數內var y = 2;拆分成兩句,一句聲明語句,移動到函數最上面,然後因為還沒有賦值,所以是undefined,不知道這樣解釋對不對。
5.2 閉包函數(綁定函數)
閉包是一個函數,所以通常也稱為閉包函數,當一個函數不在它所處環境(變數作用範圍)中被調用,仍能夠使用本地變數,這就是閉包函數。
1)作為值從函數返回的函數
function B(){ var temp = "abc"; function A(){ alert("本地變數temp的值:"+temp); } return A;}var myFunc = B();myFunc();//輸出本地變數temp的值:abc//如果你理解我剛開始講的小括弧的含義的話,這裡很容易理解為什麼會是abc。
2)利用變數作用範圍形成閉包函數
作為參數傳遞給函數的函數或作為值從函數返回的函數都是閉包函數,但是利用變數作用範圍也可以形成閉包函數
var f;function B(){ var temp = "abc"; f = function(){ alert("temp="+temp); } } B(); f();//輸出temp = abc//B()為了個f賦值,f()輸出abc
這邊還有一些有意思的代碼,
<script>//輸出都是10,原因是匿名函數中的i已經處於一個閉包環境中,當執行第一個setTimeout之前,for迴圈已經結束,i=10for(var i = 0; i<10; i++){ setTimeout(function(){ alert(i); },1000);}//輸出是不規律的0-9for(var i = 0; i<10; i++){ (function(e){ setTimeout(function(){ alert(e); },1000); })(i);}//另一種辦法for(var i = 0; i<10; i++){ setTimeout((function(e){ return function(){ alert(e); }; })(i),1000);}</script>
好了,就這些吧,明天開始物件導向,洗洗玩會遊戲去了。。