function居然是一种引用类型。这就以为着,每个函数都是Function类型的实例,而且都与其他引用类型一样,他妈的有属性,有方法。函数就是一个对象,那么函数名也就是一个指针了,和其他引用类型一模一样,也是有字面量和构造函数两种创建方法,然后再一个函数中,把函数作为参数传递进去也就很正常了
1、创建方法
var fun1=new Function("num1","num2","return num1+num2");
var fun=function(num1,num2){return num1+num2;};//就尼玛和其他引用类型的对象创建一模一样
2、没有重载
就像我前面说的那样,每个函数就是对象,所以函数名就是一个指针。接下来就清楚了函数名相同的,就是指针被重新赋值,所以ECMAScript中是没有重载的。
function add(num){
return num+100;};
function add(num){
return num+200;};
var result=add(200)//400;
你现在还看不出来的话就改变吧,把函数改成熟悉的对象表达形式
var add=function(num){
return num+100;};
add=function(num){
return num+200;};
var result=add(200)//400;
3、函数声明和函数表达式
alert(sum(10,10));
function sum(num1,num2)
{
return num1+num2};//正常输出,20.
alert(add(10,10));
var add=function(num1,num2){
return num1+num2};//产生错误
这里说的一点就是,解析器在执行环境加载数据的时候,对函数声明和函数表达式时不会一视同仁的。解析器会率先读取函数声明,并使其在执行任何代码之前可以使用;至于函数表达式,则必须要等到解析器执行到它所在的代码行,才会真正被解释执行。
除了什么时候可以通过变量访问函数这一点区别之外,函数声明与函数表达式的语法其实是等价的
4、作为值的函数
函数就是对象,所以函数就可以当做值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
函数作为参数进行传递
function call(f,some){
return f(some);};
function add10(num){
return num+10;};
var result1=call(add10,10);//20;
function getName(name){
return "hello,"+name};
var result2=call(getName,"Yao");//"hello,Yao"
函数作为另一函数的结果返回,这里我们专门用sort()作为例子讲解
var num=[2,3,4,5,6,8];
num.sort(function(a,b){return b-a});//逆序
sort函数我们以前都是这样写的,sort()中可以用一个函数对象作为参数来确定排序的指标。我们是可以自定义比较函数的比较标准的。
var str1="zhang";
var str2="huan";
alert(str1>str2);
function createFunction(propertyName){
return function(a,b){
var value1=a[propertyName];
var value2=b[propertyName];
if(value1>value2)
{
return 1;
}
else if(value1<value2)
{
return -1;
}
else{
return 0;
}
}
}
var data=[{name:"zhang",age:23},{name:"huan",age:24}];
data.sort(createFunction("name"));
alert(data[0].name);//huan
5. 函数内部属性
没怎么接触过,我现在只能先记一下,不能深入理解。
arguments.callee,在哪个函数中用,这个东西就是代表哪个函数。
arguments.callee.caller
caller中保存着调用当前函数的函数的引用。arguments.callee.caller就代表了调用了当前函数的外层函数。