javascript
javascript中函数的全解简介
來源:itelite
<script? language="javascript">
//切記特殊的兩種函數(shù)聲明方式
/*
//Function 構(gòu)造
var f=new Function("x","document.write(x);");
?f(2);
?//函數(shù)直接量
?var g=function(y)
?{
?alert("I am the Function g().");
?}
?g();???
*/
function Rectangle_area(){return this.width*this.height;}
function Rectangle_perimeter(){return 2*(this.width+this.height);}
function Rectangle_set_size(w,h){this.width=w;this.heigh=h;}
function Rectangle_enlarge(){this.width*=2;this.height*=2;}
function Rectangle_shrink(){this.width/=2;this.height/=2;}
//初學(xué)javascript中的面向?qū)ο蟮木幊谭绞?br />//構(gòu)造Retangle對象定義一個構(gòu)造函數(shù)方法
//構(gòu)造函數(shù)不僅要初始化屬性,還給方法賦值
function Rectangle(w,h)
{
?//初始化對象的屬性
?this.width=w;
?this.height=h;
?//定義對象的方法
?this.area=Rectangle_area;
?this.perimeter=Rectangle_perimeter;
?this.set_size=Rectangle_set_size;
?this.enlarge=Rectangle_enlarge;
?this.shrink=Rectangle_shrink;
}
var r=new Rectangle(3,4);
var a=r.area();
r.enlarge();
var p=r.perimeter();
document.write("The rectangle's width is :"+r.width+"<br />This rectangle'height is :"+r.height);
//alert("The rectangle's area is :"+a+",The rectangle'perimeter is :"+p);
/*
自定義異常錯誤!
throw new Error("there is something wrong!");
*/
/*
直接函數(shù)的更多應(yīng)用
直接函數(shù)和Function構(gòu)造函數(shù)一樣,函數(shù)直接兩創(chuàng)建的是未命名函數(shù),而且不會自動地將這個函數(shù)存儲在
屬性中。但是,比起Function函數(shù)構(gòu)造創(chuàng)建的函數(shù)主體必須用一個字符串說明,用這種方式來表達一個長
而復(fù)雜的函數(shù)是很笨拙的。但是函數(shù)直接量的主體使用的卻是標準的javascript語法。而且函數(shù)直接量植被
解析和編譯一次,而作為字符串傳遞給Function構(gòu)造函數(shù)的javascript代碼則在每次調(diào)用構(gòu)造函數(shù)時只需
被解析和編譯一次。
*/
//作為數(shù)據(jù)的函數(shù)實例
function add(x,y){return? x+y;}
function subtract(x,y){return x-y;}
function multiply(x,y){return x*y;}
function divide(x,y){return x/y;}
//以下的函數(shù)可以將上面的某個函數(shù)作為參數(shù)
//他的兩個參數(shù)是兩個運算數(shù)。
function operate(operator,operand1,operand2)
{
?return operator(operand1,operand2);
}
//我們可以調(diào)用該函數(shù)
var i=operate(add,2,3);
document.write("<br />operate(add,2,3)的結(jié)果是:"+i);
//看到這里我不禁想到了c#中的委托代理
//這里就給了我們一個生動形象的實例來幫助我們理解委托代理
//C#中的委托代理的目的不就是為了將函數(shù)作為參數(shù)來傳遞
//在javascript中作為數(shù)據(jù)的函數(shù),說白了就是為了實現(xiàn)我們在c#中的委托代理的目標.
var operators=new Object();
operators["add"]=function(x,y){return x+y;}
operators["subtract"]=function(x,y){return x-y;}
operators["multiply"]=function(x,y){return x*y;}
operators["devide"]=function(x,y){return x/y;}
operators["pow"]=Math.pow;
//以下的函數(shù)將運算符名作為參數(shù),在數(shù)組中檢索這個運算符.
//然后對運算數(shù)調(diào)用檢索到的函數(shù)
//注意調(diào)用這個運算符函數(shù)的語法
function operate2(op_name,operand1,operand2)
{
?if (op_name==null)
?{
??return "unknown operator!";
?}
?else
?{
??return operators[op_name](operand1,operand2);
?}
}
//我們就可以使用以下的方式調(diào)用該函數(shù)計算值 ("hello"+" "+"world!")
//var j=opertate2("add","Hello",operate2("add"," ","world!"));
var k=operate2("add","Hello",operate2("add"," ","world!"));
document.write("<br >opertate2('add','Hello',operate2('add','','world!'))的結(jié)果是:"+k);
document.write("<br>operate2('pow'.10,2)的結(jié)果是:"+operate2("pow",10,2));
//個人意見
//這種使用方法實際上就是在javascript中提到的屬性的關(guān)聯(lián)數(shù)組的用法,為我們的編程提供了
//強大的靈活性.
//javascript函數(shù)的主體是在局部作用域中執(zhí)行的,該作用域不同于全局作用域.這個新的作用域
//是通過調(diào)用對象添加到函數(shù)作用域鏈的頭部創(chuàng)建的.因為調(diào)用對象是作用域鏈的一部分,所以
//在函數(shù)體內(nèi)可以把這個調(diào)用對象的德屬性作為變量來訪問.用var語句聲明的局部變量創(chuàng)建后
//作為調(diào)用對象的屬性,而且函數(shù)的形式參數(shù)也可用于調(diào)用對象的屬性.
/*
函數(shù)調(diào)用的實際參數(shù):Arguments對象.
*/
function f(x,y,z)
{
?//首先檢查傳遞參數(shù)的數(shù)量是否正確.
?if (arguments.length!=3)
?{
??throw new Error("Function f called with "+arguments.length+"arguments ,but it expects 3 arguments!");
?}
}
//f(1,2,6,6);
function max()
{
?var m=Number.NEGATIVE_INFINITY;
?//遍歷所有參數(shù),檢索并保存其中最大的參數(shù)
?for (var i=0;i<arguments.length ;i++ )
?{
??if(arguments[i]>m) m=arguments[i];
??document.write("<br />arguments["+i+"]="+arguments[i]);
?}
?return m;
}
var largest=max(1,6,9,100,99,5);
document.write("<br />max(1,6,9,100,99,5)的結(jié)果是:"+largest);
/*
以上的實例中的Arguments對象很容易讓我們認為它是一個數(shù)組,
但我要說明的一點就是這里的arguments不是一個數(shù)組而是一個對象,雖然它也有l(wèi)ength屬性
但我們?nèi)绻阉醋髋既痪哂辛艘恍Ь幋a的屬性的對象更合適些.
*/
//aruments對象還有callee屬性
//用來引用當前正在執(zhí)行的函數(shù).看下面這個求階乘的函數(shù)
var t=function(x)
{
?if(x<=1) return 1;
?return x*arguments.callee(x-1);
}
document.write("<br />5的階乘是:"+t(5));
//函數(shù)的屬性和方法
//知道了arguments數(shù)組的length屬性指定了楚地為該函數(shù)的實際參數(shù)數(shù)目.但是函數(shù)自身的length屬性的含義
//卻非如此,它是只讀的.返回的是函數(shù)需要的實際參數(shù)數(shù)目,也就是在函數(shù)的形式參數(shù)列表中聲明的形式參數(shù)
//的數(shù)目.
function check(args)
{
?var actual=args.length;
?var expected=args.callee.length;
?if (actual!=expected)
?{
??throw new Error("Wrong number of arguments:expected : "+expected +";actually passed? "+actual);
?}
}
function f2(x,y,z)
{
?check(arguments);
?return f2.counter++;
}
//f2(4);
//同時函數(shù)還可以定義自己的屬性
f2.counter=0
document.write("<br />第一次引用f2時的counter屬性:"+f2(1,1,1));?//此時counter=2
document.write("<br />第二次引用f2時的counter屬性:"+f2(1,1,1));?//此時counter=3
//document.write("<br />第三次引用f2時的counter屬性:"+f2.counter);? //此時counter=3
//函數(shù)的apply()和call()方法
//call 和apply方法的第一個參數(shù)都是要調(diào)用的函數(shù)對象,在函數(shù)體內(nèi)這一參數(shù)可以使用this的值,
//call()的剩余參數(shù)是傳遞給要調(diào)用的函數(shù)的值.
//apply()區(qū)別于call()的地方就是apply()的參數(shù)是用數(shù)組來傳遞的
var? d=new Array(1,2,3);
f2.call(f,1,2,3);????????????????????????//此時counter=4
document.write("<br />第三次引用f2時的counter屬性:"+--f2.counter);??
f2.apply(this,d);???????????????????????//此時counter=2
document.write("<br />第四次引用f2時的counter屬性:"+f2.counter);
f.call(f2,1,2,3);????????????????????????//此時counter=2,這里沒有調(diào)用f2
document.write("<br />第五次引用f2時的counter屬性:"+f2.counter);
//以上現(xiàn)象比較怪異,應(yīng)該多想想!
//實際上以上主要在讓我熟悉++的運算
</script>?
轉(zhuǎn)載于:https://www.cnblogs.com/qq419524837/articles/1628121.html
總結(jié)
以上是生活随笔為你收集整理的javascript中函数的全解简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Media Server
- 下一篇: Nokia手机短信发件人显示乱码问题解决