javascript函数

javascript的函数比较丰富、和javascript的对象一样,需要一定的积累才可以深入理解,通过函数可以体现javascript的面向过程编程思想,通过对象类型可以更好的体现面向对

象的设计思想,本节主要大概讲述一下javascript的函数


1 函数的定义方式

javascript的函数定义分为三种:function语句形式、函数直接量形式、构造函数的形式

// function 语句定义函数  function+函数名+参数列表+函数体
 function fun1(x,y){
    return x+y;
 } 

 //执行一个函数是 fun1(3,4) 其中3,4是两个实际参数
 console.info(fun1(3,4))
 //在javascript的函数比较灵活,只会根据函数名进行匹配,和实际参数个数无关,同样返回7 
 console.info(fun1(3,4,5,6))
 
 //函数直接量 这种方式用的较多 定义一个变量,直接赋值一个函数
 var func2=function(x,y,z){
 	return x+y+z
 }

 //执行一个函数
 console.info(func2('a','b',4))
 
 //第三种形式 构造函数的形式 如果有返回值,必须放在最后一个参数,而且最好加上分号,对于形式参数需要使用引号
 //构造函数没有函数体,是顶级作用域,与前两种方式不同
 var func3=new Function('x','y','return x+y')
 //执行函数 
 console.info(func3(3,5))


2 arguments参数

主要两个作用,1、获取实际参数、2、可以递归调用自己

//对于通过function定义函数、函数直接量定义的函数,都有一个特定的隐藏对象arguiments
 //需要注意的是通过顶级作用域的构造函数Function 定义的函数是没有arguments对象
 //1 arguments作用一,接受函数的实际参数,可以获取实际参数的长度,具体的实际参数
 //对于arguments的使用需要在函数体中
 var fun4=function(){
 	Ext.Msg.alert('实际参数长度',arguments.length)
 	Ext.Msg.alert('第一个参数值',arguments[0])
 	return 1;
 }
 console.info(fun4(1,2,3,4))
})

//2 arguments作用二,用于函数的递归操作
// 求一个数的阶乘
 function fun5(x){
 	if(x==1){
 		return 1;
 	}else{
 		// 一般可以这样写,但是不够严谨
 		return x*fun5(x-1)
 		//最标准的写法
 		return x*arguments.callee(x-1) 
 	}
 
 }

3 闭包

主要需要理解的概念执行环境、作用域链、js垃圾回收

主要的作用是避免使用全局变量

//函数碰到return直接返回、没有renturn 返回结果undefined
//在javascript语言里: 更不提倡使用全局变量 (1:不安全、2:做变量搜索查找的时候效率比较低)
//通过闭包可以保留具备变量的值
//避免使用全局变量 点击按钮 统计点击的次数
var inp=function(){
	var i=0;
	return {
	  getCount:function(){
	  	alert(++i);
	  }
	}
}()

<input type="button" onclick="inp.getCount()" value="按钮"/>

4 区别

//函数定义的区别
 // 通过function语句定义的,会在执行javascript代码前优先加载 function定义的函数
 // 通过函数直接量、构造函数定义的则会从上到下依次执行
 // 1 演示在代码中先执行函数,后定义函数
 //执行函数代码
 //这段代码不会报错,因为function定义的函数优先加载
 console.info(fun6(4,5));
 function fun6(x,y){
 	return x*y
 }
 // 使用函数直接量,则报错undefined
/* console.info(fun7(4,5));
 var fun7=function (x,y){
 	return x*y
 }*/
 
 //使用构造函数,同样报错undefined 
/* console.info(fun8(6,7));
 var fun8=new Function('x','y','return x+y;')*/
 
//作用域区别
// 通过构造函数创建,具有顶级作用域,只能取window对象定义的变量,全局变量
  var b=1
  function test(){
   var b=2
   // 这种方式优选局部变量,然后才是全局变量 
   var f=function(){return b};
   alert(f())
   // 只能与全局变量
   var s=new Function("return b;")
   alert(s())
  }
 console.info(test())

5 apply call函数

call apply 主要作用是绑定作用域

this 关键字,在javascript中,总是指向调用者,谁调用函数,this就指向谁

apply第一个参数是对象,第二个参数是数组表示实际参数

call 第一个参数是对象,后面是实际参数

 // call apply 主要作用是绑定作用域
 // this 关键字,在javascript中,总是指向调用者,谁调用函数,this就指向谁
 
 //这个变量是属于window的,全局变量
 var color='red' 
 // 定义一个obj,对象,有一个color属性
 var obj={'color':'blue'}
 
 var fun12=function(x,y,z){
 	//指向调用者的color属性
    alert(this.color)
    return x+y+z
 }
 // window 调用,返回red
 fun12();
 //obj对象调用,返回blue
 //call 第一个参数是对象,后面是实际参数
console.info(fun12.call(obj,1,2,3))
// apply第一个参数是对象,第二个参数是数组表示实际参数
console.info(fun12.apply(obj,[1,2,4]))



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章