函数Function

函数Function

1、概述:函数是完成特定任务的可重复调用的代码段,是JavaScript组织代码的单位 。
2、功能:将代码组织为可复用的单位,可以完成特定的任务并返回数据

[@more@]

3、函数定义:
3.1、JavaScript的函数属于Function对象,因此可以使用Function对象的构造函数来创建一个函数 。
3.2、可以使用function关键字以普通的形式来定义一个函数
如:
var say = Function([参数列表]){语句;[return 表达式]} //函数变量
function 函数名([参数列表]){语句;[return 表达式]} //普通函数

4、函数指针调用方式
回调 :其机制是通过指针来调用函数 。
一般函数的调用方式是常见而且普通的,但JavaScript中函数调用的形式比较多,非常灵活。
有一种重要的、在其它语言中也经常使用的调用形式叫做回调 。回调函数按调用者的照约定
实现函数的功能,由调用者调用

函数返回类型
一般情况下,函数返回的非对象数据都使用值返回方式
引用类型返回的是数据的地址,而不是数据本身 。
引用传递的优点是速度快,但系统会为维护数据而付出额外的开销。通常返回复合类型数据时使用引用传递方式
function getNameList(){
var list = new Array("张三","李四","王五");
return list ; //返回引用
}
var nameList = getNameList() ;
nameList = null ; //删除引用

返回函数 :函数可以返回一个函数指针
外部代码可以通过指针调用其引用的函数对象,调用方式和一般函数完全一样。
一般情况下私有函数不能被外界直接调用,因此可以将一个私有函数的地址作为结果返回给外界使用

function getSum(){
function sum(a,b){
return a+b ;
}
return sum ;
}
var sumOfTwo = getSum() ;
var total = sumOfTwo(1,2) ;


函数的作用域
公有函数:是指定义在全局作用域中,每一个代码都可以调用的函数 。
私有函数 :是指处于局部作用域中的函数 。当函数嵌套定义时,
子级函数就是父级函数的私有函数。外界不能调用私有函数,私有函数
只能被拥有该函数的函数代码调用 。


function a(){
alert("a");
function b(){
alert("b");
function c(){
alert("c");
}
}
b(); //可以
c(); //不可以
}
a(); //调用a

view plaincopy to clipboardprint?
//定义通用排序函数
function sortNumber(obj,func){
//参数验证,如果不是指定参数类型则抛出异常
if(!(obj instanceof Array)||!(func instanceof Function)){
var e = new Error(); //生成错误信息
e.number = 100000 ; //定义错误号
e.message = "参数无效" ;//错误描述
throw e ; //抛出异常
}else{
for(n in obj){ //开始据排序
for(m in obj){
if(func(obj[n],obj[m])){ //使用回调函数排序,规则由用户设定
var temp = obj[n] ; //创建临时变量
obj[n] = obj[m] ; //交换数据
obj[m] = temp ;
}
}
}
}
return obj ; //返回排序后的数组
}

//回调函数,用户定义的排序规则
function greatThan(arg1,arg2){
return arg1>arg2 ; //规则:从大到小
}

try{
var numAry = new Array(5,8,6,32,1,45,7,25); //生成一数组
pf("排序前:"+numAry);
sortNumber(numAry,greatThan); //调用排序函数
pf("排序后:"+numAry);
}catch(e){ //捕捉异常
alert(e.number+" : "+e.message); //异常处理
}
//定义通用排序函数
function sortNumber(obj,func){
//参数验证,如果不是指定参数类型则抛出异常
if(!(obj instanceof Array)||!(func instanceof Function)){
var e = new Error(); //生成错误信息
e.number = 100000 ; //定义错误号
e.message = "参数无效" ;//错误描述
throw e ; //抛出异常
}else{
for(n in obj){ //开始据排序
for(m in obj){
if(func(obj[n],obj[m])){ //使用回调函数排序,规则由用户设定
var temp = obj[n] ; //创建临时变量
obj[n] = obj[m] ; //交换数据
obj[m] = temp ;
}
}
}
}
return obj ; //返回排序后的数组
}

//回调函数,用户定义的排序规则
function greatThan(arg1,arg2){
return arg1>arg2 ; //规则:从大到小
}

try{
var numAry = new Array(5,8,6,32,1,45,7,25); //生成一数组
pf("排序前:"+numAry);
sortNumber(numAry,greatThan); //调用排序函数
pf("排序后:"+numAry);
}catch(e){ //捕捉异常
alert(e.number+" : "+e.message); //异常处理
}

函数的长度属性

Function.length : 是一个只读的属性,它返回函数定义的参数个数
arguments 返回我们调用函数时传递的参数列表

view plaincopy to clipboardprint?
function check(args) {
var actual = args.length; // 实际参数个数
var expected = args.callee.length; // 期望参数个数
if (actual != expected) {
//当实参与形参个数不匹配时抛出异常
throw new Error("错误的参数个数;形参数为: " + expected + ", 实际传参数为: " + actual);
}
}

function f(x, y, z) {
var result = 0 ;
try{
//检查实参与形参是否匹配
check(arguments);
result = x + y + z;
}catch(ex){
document.write("
出错啦!错误消息: "+ex.description);
}
return result;
}

document.write("
调用形式为:f(1,2,3)其结果为:
t"+f(1,2,3));
document.write("
调用形式为:f(1,2)其结果为:
t"+f(1,2));
function check(args) {
var actual = args.length; // 实际参数个数
var expected = args.callee.length; // 期望参数个数
if (actual != expected) {
//当实参与形参个数不匹配时抛出异常
throw new Error("错误的参数个数;形参数为: " + expected + ", 实际传参数为: " + actual);
}
}

function f(x, y, z) {
var result = 0 ;
try{
//检查实参与形参是否匹配
check(arguments);
result = x + y + z;
}catch(ex){
document.write("
出错啦!错误消息: "+ex.description);
}
return result;
}

document.write("
调用形式为:f(1,2,3)其结果为:
t"+f(1,2,3));
document.write("
调用形式为:f(1,2)其结果为:
t"+f(1,2));

函数的参数及调用

view plaincopy to clipboardprint?


函数Call的用法

view plaincopy to clipboardprint?
function fun(){
document.write("
调用者为:"+ this.toString() +" , 调用函数为fun()" );
}

//fun()的调用形式与fun.call(this)的调用形式一样
fun();
fun.call(this);
//用JS中的固定对象Math去执行fun()方法
fun.call(Math);

//自定义一个对象
var p = {
name : "自定义对象p",
//重写Object对象的toString()方法
toString : function(){
return this.name;
}
};
//用自定义的对象去执行fun()方法
fun.call(p);


//调用方法有参数时的call调用形式
document.write("

");
function fun2(str){
document.write("
调用方法有参数时的call调用形式 fun2.call(obj,args)");
};
fun2.call(this);


//实例
var fruit = {name:"苹果",act:"吃的"};
var book = {name:"电脑书",act:"读的",play:function(){
document.write("
"+this.name+" 是用来 "+this.act+" !");
}};
book.play();
book.play.call(fruit);
book.play.call(Math);
function fun(){
document.write("
调用者为:"+ this.toString() +" , 调用函数为fun()" );
}

//fun()的调用形式与fun.call(this)的调用形式一样
fun();
fun.call(this);
//用JS中的固定对象Math去执行fun()方法
fun.call(Math);

//自定义一个对象
var p = {
name : "自定义对象p",
//重写Object对象的toString()方法
toString : function(){
return this.name;
}
};
//用自定义的对象去执行fun()方法
fun.call(p);


//调用方法有参数时的call调用形式
document.write("

");
function fun2(str){
document.write("
调用方法有参数时的call调用形式 fun2.call(obj,args)");
};
fun2.call(this);


//实例
var fruit = {name:"苹果",act:"吃的"};
var book = {name:"电脑书",act:"读的",play:function(){
document.write("
"+this.name+" 是用来 "+this.act+" !");
}};
book.play();
book.play.call(fruit);
book.play.call(Math);

函数的闭包

闭包 : closure 微软在设计Ajax时就使用这种技术来模拟类
很显然,这种模型的类描述特别象C#语言的描述形式,在一个构造函数里依次定义了私有成员、公共属性和可用的方法,显得非常
优雅嘛。特别是“闭包”机制可以模拟对私有成员的保护机制,做得非常漂亮。
所谓的“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层外层函数体中
的临时变量。这使得只要目标对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。尽管最开始的构
造函数调用已经结束,临时变量的名称也都消失了,但在目标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访
问。即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新的值,和上次那次调用的是各自独立的。的确
很巧妙!但是前面我们说过,给每一个对象设置一份方法是一种很大的浪费。还有,“闭包”这种间接保持变量值的机制,往往会给JavaSript
的垃圾回收器制造难题。特别是遇到对象间复杂的循环引用时,垃圾回收的判断逻辑非常复杂。无独有偶,IE 浏览器早期版本确实存在
JavaSript 垃圾回收方面的内存泄漏问题。再加上“闭包”模型在性能测试方面的表现不佳,微软最终放弃了“闭包”模型,而改用“原型”
模型。正所谓“有得必有失”嘛。
普通函数在调用完后,如果没有外部的引用就会被销毁
使用闭包结构的函数,则使闭包中的内容有选择的保留下来了

view plaincopy to clipboardprint?


全局函数

未与任何函数关联的函数
decodeURI(URIstring):返回一个已编码的统一资源标识符 (URI) 的非编码形式。 必要的 URIstring 参数代表一个已编码 URI 的值。
encodeURI(URIString):将文本字符串编码为一个有效的统一资源标识符 (URI)。encodeURI 方法不会对下列字符进行编码:":"、"/"、";" 和 "?"。
isNaN(numValue):数值判断函数 ,如果值是 NaN, 那么 isNaN 函数返回 true ,否则返回 false 。 *
parseInt(numString, [radix]):将不同进制的数值转换成十进制,底数radix可选。
parseFloat(numString):返回由字符串转换得到的浮点数。
eval(codeString):检查 JScript 代码并执行.eval 函数允许 JScript 源代码的动态执行。

view plaincopy to clipboardprint?
//对url地址进行编码
var url1 = "http://www.csdn.net/ppjava2009/note.aspx?name='函数原形'";
pf("encodeURI编码前为:"+url1+" , 编码后为:"+encodeURI(url1));
pf("decodeURI解码前为:"+encodeURI(url1)+" , 编码后为:"+decodeURI(encodeURI(url1)));

//判断非数值isNaN,如果值是NaN则返回true,否则返回false
var s1 = "123abc";
var s2 = "123";
var s3 = 30;
var s4 = new Number("8");
pf(isNaN(s1)); //打印true
pf(isNaN(s2)); //打印false
pf(isNaN(s3)); //打印false
pf(isNaN(s4)); //打印false


//数值转化 parseInt(str)和parseFloat(str)
var n1 = "123abc5";
var n2 = "abc";
var n3 = "123.5d4";
pf(parseInt(n1)); //打印123,数值转换时遇到字母、小数点以及其它字符就停止
pf(parseInt(n2)); //打印NaN 转换没有报异常
pf(parseInt(n3)); //打印123

var n4 = "123.5d4";
var n5 = "0.884";
pf(parseFloat(n4)); //打印123.5
pf(parseFloat(n5)); //打印0.884

//eval编译器
var str = "alert('hello eval')";
eval(str); //弹出"hello eval"



function pf(str){
document.write("
"+str);
}
//对url地址进行编码
var url1 = "http://www.csdn.net/ppjava2009/note.aspx?name='函数原形'";
pf("encodeURI编码前为:"+url1+" , 编码后为:"+encodeURI(url1));
pf("decodeURI解码前为:"+encodeURI(url1)+" , 编码后为:"+decodeURI(encodeURI(url1)));

//判断非数值isNaN,如果值是NaN则返回true,否则返回false
var s1 = "123abc";
var s2 = "123";
var s3 = 30;
var s4 = new Number("8");
pf(isNaN(s1)); //打印true
pf(isNaN(s2)); //打印false
pf(isNaN(s3)); //打印false
pf(isNaN(s4)); //打印false


//数值转化 parseInt(str)和parseFloat(str)
var n1 = "123abc5";
var n2 = "abc";
var n3 = "123.5d4";
pf(parseInt(n1)); //打印123,数值转换时遇到字母、小数点以及其它字符就停止
pf(parseInt(n2)); //打印NaN 转换没有报异常
pf(parseInt(n3)); //打印123

var n4 = "123.5d4";
var n5 = "0.884";
pf(parseFloat(n4)); //打印123.5
pf(parseFloat(n5)); //打印0.884

//eval编译器
var str = "alert('hello eval')";
eval(str); //弹出"hello eval"

function pf(str){
document.write("
"+str);
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ppjava2009/archive/2010/02/24/5323077.aspx

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23493047/viewspace-1033144/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23493047/viewspace-1033144/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值