函数类型的理解
来源:互联网 发布:java oop 编辑:程序博客网 时间:2024/06/11 17:17
Function 类型
function sun(num1,num2){
return num1+num2;
}
alert(sum(10,10)); //20
var anotherSun=sun;
alert(anotherSun(10,10)); //20
sun=null;
alert(anotherSun(10,10)); //20
以上代码首先定义了一个名为 sun 的函数,用于求两个值的和。然后又声明变量 anotherSun,把 sun 的值赋给 anotherSun,这里注意不带圆括号的函数是访问函数指针。此时,anotherSun 和 sun 都指向同一个函数,因此 anotherSun( ) 也可以被调用并返回结果,尽管把 sun 设置成为 null,但仍然可以调用 anotherSun( )。
没有重载(深入理解)
在同一个环境里,同时声明两个同名函数,后面的函数会覆盖前面的函数。
函数声明与函数表达式
alert(sum(10,10));
function sum(num1,num2){
return sum1+sum2;
}
//20,能够正常运行
alert(sum(10,10));
var sum=function(num1,num2){
return sum1+sum2;
}
//报错
在浏览器中,解析器向执行环境加载数据时,对函数声明和函数表达式并非一视同仁,解析器会先读取函数声明并添加到执行环境中;至于函数表达式,此时的函数已经赋给一个变量,这个时候的解析器是一行一行往下解析的,在执行到函数所在语句中,根本没有 sum 函数的引用, 第一行就会导致报错,根本不会执行到下一行。除此之外,函数声明和函数表达式语法是等价的。
作为值的函数
function create(propertyName){
return function(obj1,obj2){
var value1=obj1[propertyName];
var value2=obj2[propertyName];
if(value1<value2){
return -1;
}else if(value>value2){
return 1;
}else{
return 0;
}
};
}
var date=[{name:'Zachary',age:'28'},{name:'Nicholas',age:'29'}];
data.sort(create('name'));
alert(date[0].name); //Nichoas
data.sort(creae('age'));
alert(data[0].name); //Zachary
最初在书里看到这个函数,我还是懵的,来来回回看了好几遍才理解。
这里,创建了两个包含两个数组的 data 对象,每个对象有两个属性,对data 使用了 sort( ) 方法,同时调用 create 函数作为 sort( ) 方法的参数来决定次序。
第一个 alert 的‘name’作为参数传进给 create 函数,里面又嵌套了一个函数,value1 保存着 data 数组里第一个对象的 name值 ,value2 保存着数组里第二个对象的 name 值,然后做个 if 判断(这个判断在数组章节有写),按照 name 属性的值进行排序,最后得到的排在第一的是 {name:'Nicholas',age:'29'} 的对象,想也明白,字母顺序表里,N 肯定要比 Z 的顺序靠前。
第二个alert 原理一样,是以 ‘age’值作为依据来判断,最后排在第一个的是 {name:'Zachary',age:'28'} 这个对象,想也明白,在if 判断之后,28 要比 29靠前。
函数内部的属性
function a(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1)
}
}
var b=a;
a=function(){
return 0;
}
alert(b(5)); //120
alert(a(5)); //0
第一次看我自己是没看懂这种定义阶乘函数,递归算法,为什么会等于120呢?也是来来回回看了几遍才懂。
arguments.callee 指向的是正在执行的函数。
5<=1,不成立,5*(5-1)=20,将得到的20 return 回去,此时的 num 值已经减1,为4;
4<=1,不成立,20*(4-1)=60,将得到的60 return 回去,此时的 num 值减1,为3;
3<=1,不成立,60*(3-1)=120,将得到的120 return 回去,此时 num 值减1,为2;
2<=1,不成立,120*(2-1)=120,得到120。
后面的就好理解了,把函数 a 赋值给 b,再把函数给返回0,调用 b 得到120,调用 a 得到0。
函数属性和方法
apply( ) 和 call( ) ,这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。
这两个方法不同在于接收参数的方式不同,具体就不写了,这两个方法什么强大的是能扩充函数赖以运行的作用域。
还有一个bind( ) 方法,这个方法会创建一个示例,其this值会被绑定传给 bind( ) 函数的值
window.color='red';
var o={color:'blue'};
function sayColor(){alert(this.color)};
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
var boj=sayColor.bind(o);
boj(); //blue
1 0
- 函数类型的理解
- 6.7.2 理解列表函数的类型签名
- javascript 中函数类型(自己理解的)
- 6.7.2 理解列表函数的类型签名
- 对c++中模板函数函数类型或者函数对象了类型显式指定的理解
- .net类型的理解
- 枚举类型的理解
- 枚举类型的理解
- byte类型的理解
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- 理解虚拟网络的类型
- 理解JAVA的集合类型
- 理解c#的String类型。
- Volatile 类型修饰 的理解
- 对于NAT类型的理解
- 理解C#的string类型
- 理解复合类型的声明
- mysql忽略大小写,lower_case_table_names配置
- Python-struct.error: argument for 's' must be a bytes object
- 研究一下JS的转型函数
- Ubuntu配置CodeBlocks+opencv
- int main(int argc,char* argv[])详解
- 函数类型的理解
- 排序算法性能比较
- android自定义控件之Attr
- 过滤器、监听器与拦截器区别
- C++简单类中如何书写Makefile(二)
- 知识点:居中大盘点
- 关于自己
- SAP根据用户名查姓名
- 剑指offer--二进制中1的个数