Function类型

ECMAScript中函数是对象,每个函数都是Function类型的实例,也有属性和方法,函数是对象,函数名实际上市一个指向函数对象的指针,不会与某个函数绑定;

function sum(num1,num2){

return num1+num2;

}

同:

var sum=function(num1,num2){

return num1+num2;

};

(1)没有重载

若声明了两个同名函数,后面的函数会覆盖前面的函数;

(2)函数声明和函数表达式

解析器会率先读取函数声明,并使其在执行任何代码之前可以访问,而函数表达式,必须等到解析器执行到它所在的代码行,才会真正被解释执行;

alert(sum(10,10));

function sum(num1,num2){

return num1+num2;

}

以上代码正常执行,解析器在代码执行之前,读取并将函数声明添加到执行环境中,对代码求值时,js引擎在第一遍会声明函数并将它们放到源代码树的顶部;

以下代码中(函数表达式方法),在执行期间导致错误

alert(sum(10,10));

var sum=function(num1,num2){

return num1+num2;

}

函数位于一个初始化语句中,而不是一个函数声明,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用;

(3)作为值的函数

函数本身就是变量,函数可以作为值来使用,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回;

function callSomeFunction(somFunction,someArgment){

return someFunction(someArgment);

}

function add10(num){

return num+10;

}

var result=callSomeFunction(add10,10);

alert(result);   //20

可以从一个函数中返回另一个函数

function createComparisonFunction(propertyName){

return function(object1,object2){

var value1=object1[propertyName];

var value2=object2[propertyName];

if (value1<value2){

return -1;

}else if(value1>value2){

return 1;

}else {

return 0;

}

};

}

(4)函数内部属性

在函数内部有两个特殊的对象:arguments和this;

arguments保存函数参数,还有个callee属性,为一个指针,指向拥有这个arguments对象的函数;

function factorial(num){

if(num<=1){

return 1;

}else{

return num*arguments.callee(num-1);

}

}

this引用的是函数据以执行的环境对象;

ECMAScript5规范了另一个函数对象属性:caller,这个属性中保存着调用当前函数的函数的引用;如果是在全局作用域中调用当前函数,它的值为null;

当函数在严格模式下运行时,访问arguments.callee会导致错误,argumen.caller也是,在非严格模式下这个属性始终是undefined;

在严格模式下不能为函数的caller属性赋值,否则会导致错误;

(5)函数属性和方法

每个函数都包含两个属性:length和prototype;

length属性表示函数希望接收的命名参数的个数;

对于ECMAScript中的引用类型而言,prototype是保存它们所有实例方法的真正所在,prototype属性不可枚举;

每个函数都包含两个非继承而来的方法:apply和call;在特定的作用域中调用函数,即设置函数体内this对象的值;

apply方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组(可以是Array的实例,也可以是arguments);

function sum(num1,num2){

return num1+num2;

}

function callSum1(num1,num2){

return sum.apply(this,arguments);

}

function callSum2(num1,num2){

return sum.apply(this,[num1,num2]);

}

alert(callSum1(10,10)); //20

alert(callSum2(10,10));  //20

在严格模式下,为指定环境对象而调用函数,this值不会转型为window;

call方法,传递给函数的参数必须逐个列举出来

function sum(num1,num2){

return num1+num2;

}

function callSum(num1,num2){

return sum.apply(this,num1,num2);

}

alert(callSum(10,10)); //20

apply和call真正强大的地方时能够扩充函数赖以运行的作用域;

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

ECMAScript5还定义了bind方法,这个方法会创建一个函数实例,其this值会被绑定到传给bind函数的值:

window.color=”red”;

var o={color:”blue”};

function sayColor(){

alert(this.color);

}

var objectSayColor=sayColor.bind(o);

objectSayColor();  //blue

每个函数继承的toLocalString和toString方法始终都会返回函数的代码;

最新文章

  1. beat your own python env
  2. 影响div背景色显示的问题
  3. ArcEngine中合并断开的线要素(根据几何判断)
  4. 【CodeVS 1218】【NOIP 2012】疫情控制
  5. JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-003Table per concrete class with unions(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)、&lt;union-subclass&gt;)
  6. .NET连接SAP系统专题:C#调用RFC代码(三)
  7. 利用nf_conntrack机制存储路由,省去每包路由查找
  8. js createElement
  9. MFC对话框屏蔽Enter和ESC键
  10. VS2008下OpenCV1.0的设置
  11. 在线office文档编辑NTKO使用心得
  12. 有关ActiveXObject的兼容性问题(浏览器的特有属性)
  13. mysql数据库相关知识
  14. Redis两种方式实现限流
  15. 项目工程中的WebRoot与WebContent有什么区别?
  16. redhat yum
  17. MySQL事件不自动执行
  18. list 删除一个元素的三种做法--python
  19. SPL之AccessArray
  20. java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.test.Test

热门文章

  1. Visual Studio 试用版的评估期已经结束【解决方案】
  2. react dva 表单校验
  3. AtCoder Regular Contest 075 C D E (暂时)
  4. 【eclipse】导入/导出开发环境(包括编辑器字体颜色大小等)
  5. 修复无法启动的mariadb
  6. hdu 3061 hdu 3996 最大权闭合图 最后一斩
  7. 腾讯云使用liveRoom开启直播时,报“房间已存在”错误?
  8. Codeforces Gym101522 A. Ambiguous Dates (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)
  9. 玲珑杯 Round #5 Problem E Tetration (枚举 + 欧拉公式)
  10. BZOJ1088(SCOI2005)