javascript--函式基礎(函式的定義/作用域,回撥函式,即時函式,內部(私有)函式,返回函式的函式,重寫自己的函式)
函式源於數學對映運算,它定義了一種關係,這種關係使一個集合裡的每一個元素對應到另一個(可能相同的)集合裡的唯一元素
javascript中:
函式是程式碼塊,一段被封閉嚴實的程式碼塊
函式是資料:使用者可以把函式作為 值 賦值給 變數
函式是一種物件,它是一類抽象類(建構函式),所有物件都是通過型別構造而來var a=new Array() var f=new Function();
一 :定義函式的3中方法:(函式若沒有return則預設返回undefined)
----function語句:具有函式作用域(以命令的形式 靜態 構造
function() f(x){return x}
----Function建構函式:(頂級函式)具有頂級作用域(解析函式體,動態 建立一個函式物件)
var f=new Function("x","return x")
---函式直接量:具有函式作用域(以表示式的形式 靜態 建立一個函式)
var f=function(x){return x}
舉例:以下等價
var f=new Function("a,b,c","return a+b+c")
var f=new Function("a","b","c","return a+b+c")
var f=new Function("a,b","c","return a+b+c")
function f(a,b,c){ return a+b+c}
var f=function(a,b,c){return a+b+c}
2理解 頂級作用域和區域性作用域
var n=1;
function f(){
var n=2;
function e(){
return n;
}
return e;
}
alert(f()());//2
---------------------------------------------------------------
var n=1;
function f(){
var n=2;
var e=function(){
return n;
}
return e;
}
alert(f()());//2 普通函式作用域
-----------------------------------------------------------
var n=1;
function f(){
var n=2;
var e= new Function("return n;")
return e;
}
alert(f()());//1 頂級函式作用域
二. 預定義函式
javascript提供的可供隨時呼叫的內建函式
parseInt() parseFloat() isNaN() isFinite()
encodeURI(url) decodeURI()
encodeURIComponent(url) decodeURIComponent()
eval()
alert()--這個是宿主環境-瀏覽器提供
三:回撥函式
當我們將函式A傳遞給函式B,並由B來執行A時,A就成了一個 回撥函式 (callback functions),若果這時A還是一個匿名函式,則稱為匿名回撥函式
function multiplayByTwo(a,b,c){
var i,ar=[];
for(i=0;i<3;i++){
ar[i]=argment[i]*2;
}
return ar;
}
funtion addOne(a){return a+1;}
multiplayByTwo(1,2,3);//[2,4,6]
addOne(100);//[101]
var myarr=[];
myarr=mulplayByTwo(10,20,30);//[20,40,60]
for(var i=0;i<3;i++){
myarr[i]=addOne(myarr[i])
}
myarr //[21,41,61]
修改成回撥函式:
funtion addOne(a){return a+1;}
function multplayByTwo(a,b,c,callback){//使用回撥函式callback
var i,ar=[];
for(i=0;i<3;i++){
ar[i]=callback(arguments[i]*2);
}
return ar;
}
myarr=multplayByTwo(1,2,3,addone)
multplayByTwo(1,2,3,function(){//簡化,使用匿名函式 直接代替addone()
return a+1;
})
四、即時函式
(function(name){alert('hello'+name)})('Owen')// hello Owen
var result=(function(){... ;return someting}())
var result=function(){... ;return someting}()//可讀性比上一句差了點,不讀到最後不知道result到底是一個函式還是一個即時函式的返回值
五、內部(私有)函式
function outer(param){
function inner(theinput){
return theinput*2;
}
return 'the result is'+inner(param);
}
var outer=function(param){
var inner=function(theinput){
return theinput*2;
}
return 'the result is'+inner(param);
}
outer(2)//'the result is 4'
inner(2)//報錯, 這是個私有函式,外部不能呼叫
六、返回函式的函式
function a(){
alert('A!');
return function(){
alert('B!');
}
}
var newF=a();//A!
newF();//B!
七、能重寫自己的函式
function a(){
alert('A!');
a=function(){
alert('B!');
}
}
八、閉包(getter ,setter ,迭代器(next()))
利用閉包實現迭代器
function setup( ){
var i=0;
return function(){
return x[i++]
}
}
var next=setup(['a','b','c','d']);
next();//a
next();//b
next();//c
利用閉包getter setter
var getValue,setValue;
(funciton(){
var secret=0;
getValue=function(){
return secret;
}
setValue=funciton(v){
if(typeof v==='number'){
secret = v;
}
}
})()