javaString的函数类型剖析

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]))
时间: 2024-08-07 04:32:06

javaString的函数类型剖析的相关文章

swift学习之函数类型

var someInt: Int = 7 Int 就是表示someInt的类型,同理,这个Int也可以换成函数类型,所以也可以像其他类型那样使用函数类型 函数类型主要由三种用途:(一)就是上面说的了 (二)作为参数(三)作为返回类型 再加一个,就是函数也可以嵌套(nested) let math: (Int , Int) -> Int = addTwoInts printMathResult(math, a: 9, b: 9) //printMathResult(math, 9, 9) func

C++数组类型与函数类型

之所以将C++的数组类型与函数类型拿到一块说,是因为两者在很多地方都一样. 首先,声明形式上类似: 数组类型:  type [num]                                          数组:type name[num] 函数类型:  return_type (形参列表)    函数:return_type name(形参列表) 数组指针类型: type (*)[num] 数组指针:type (*name)[num] 函数指针类型: return_type (*)

浅谈swift中的函数类型和闭包

在讲swift的函数类型之前,我们先回忆一下我们以前学的定义一个swift的函数 func add(a: Int,b: Int) -> Int { return a + b } 好了, 我们开始我们函数类型的讲解 上面这个函数的类型是(Int ,Int)->Int 使用函数类型 我们都知道, 在swift中 , 函数类型就像其他数据类型一样,也就意味着我们可以给一个函数的常量或者是变量赋值 var f2: (Int,Int)-> Int = add f2(2,3) //结果为5 好了,接

Swift函数类型

函数可以作为一种类型使用,作为类型与其它数据类型没有区别: 有如下3个函数的定义: (1)func rectangleArea(width : Double, height : Double ) -> Double { let area = width * height return area } (2)func triangleArea(bottom : Double, height : Double ) -> Double { let area = 0.5 * bottom *  heig

明显调用的表达式前的括号必须具有(指针)函数类型 编译器错误 C2064

看到“明显调用的表达式前的括号必须具有(指针)函数类型”这句时我才发现我的语文水平有多烂,怎么看都看不懂,折腾了半天才知道是哪里出了问题. 举个简单的例子 class CTest { void (CTest::*m_pFun)(); void CallFun() { (this->*m_pFun)(); //OK,对象指针和函数名一定要用括号括起来,函数名前面要加上*号 this->*m_pFun(); //error (this->m_pFun)(); //error } //本文链接

Swift - 32 - 函数类型

//: Playground - noun: a place where people can play import UIKit func add(a:Int, b:Int) -> Int { return a + b } // 其中, (Int, Int) -> Int 就是显式的声明函数类型 let anotherAdd:(Int, Int) -> Int = add anotherAdd(3, 4) /*--------------------------------------

C函数类型和函数指针使用方法详解

二.通常的函数调用 一个通常的函数调用的例子: /* 自行包含头文件 */ void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */ int main(int argc, char* argv[]) {    MyFun(10); /* 这里是调用MyFun(10) 函数 */    return(0); } void MyFun(int x) /* 这里定义一个MyFun函数 */ {    printf("%d\n",x); } 这个My

函数类型

在C和C++中,函数也是一种类型,原因是可以指向函数的指针.这个指针指向了内存中函数的入口处.(多么有趣的现象!因为这一下子把程序和进程的概念似乎又引入进来了!) void (*fPtr)(int );//这是一个变量的定义,指针变量 由于函数是一种类型,我也就可以使用typedef关键字: 对于函数:void function (int a); 有 typedf void FUNCTION (int a);//定义一种函数类型 FUNCTION *p=fPtr;//p是指向上面定义的函数类型的

C++函数类型

继续上一篇 #include <iostream> using namespace std; void swap1(int &v1, int &v2); typedef void (FP_)(int&, int&);//必须在FP_使用前定义!!! void func(int &v1, int &v2, FP_ fp); int main() { void (*fp)(int&,int&);//here, fp is a vari