引用类型之 Function 类型:函数就是对象,函数名是指针。每一个函数都是 Function 类型的实例,而且和其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。
函数声明与函数表达式
解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其执行代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。因此,除了什么时候可以通过变量访问函数这一点区别外,函数声明与函数表达式的语法其实是等价的。
- //使用函数声明,可以正常执行。首先读取并将函数声明添加到执行环境中alert(sum(10,20));function sum(num1,num2){ return num1+num2;}//使用函数表达式不能正确执行,因为函数还没有加载alert(sum(10,20));var sum=function (num1,num2){ return num1+num2;}
函数没有重载
- function sum(num1, num2) {
- return num1 + num2;
- }
- function sum(num1) {
- return num1;
- } //比没有执行第一个函数,而是执行了第二个函数。所以函数没有重载。//理解函数名是指针,第二个函数覆盖了第一个,指针执行了另一个地址。alert(sum(20,30)); //20
作为返回值的函数
- //接收两个参数,第一个参数是一个函数,第二个应该是要传递给该函数的一个值function callSomeFunction(someFunction,someArgument){ return someFunction(someArgument);}function add10(num){ return num+10;}var result1=callSomeFunction(add10,10);alert(result1);function getGreeting(name){ return "Hello,"+name;}var result2=callSomeFunction(getGreeting,"Tom");alert(result2);
- //通过根据不同的属性,返回不同的比较函数function createComparisonFunction(propertyName){ return function(object1,object2){ var value1=object1[propertyName]; var value2=object2[propertyName]; if(value1value2){ return 1; }else{ return 0; } }}var data=[{name:"Tom",age:25},{name:"Jerry",age:30}];data.sort(createComparisonFunction("name"));alert(data[0].name);//Jerrydata.sort(createComparisonFunction("age"));alert(data[0].name);//Tom
函数内部属性
- //使用arguments.callee替代函数名,消除耦合function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); }}alert(factorial(5));
- var color = "red";
- var o = {
- color: "blue"
- };
- function sayColor() {
- alert(this.color);
- }
- sayColor(); //red//函数据以执行的环境对象o.sayColor=sayColor;o.sayColor(); //blue
- function outer() {
- inner();
- }
- function inner() {
- alert(arguments.callee);
- alert(inner.caller);
- }
- /** * 调用输出的是 * alert(arguments.callee); *callee 指向当前的函数 * function inner(){ alert(arguments.callee); alert(inner.caller); } * alert(inner.caller); caller指向调用当前函数的函数 * function outer(){ inner(); } */
- outer();
函数的属性和方法
- function sum(num1, num2) {
- return num1 + num2;
- }
- function callSum1(num1, num2) { //运行函数的作用域:在这里指callSum1 //传入arguments对象 return sum.apply(this,arguments);}function callSum2(num1,num2){ //传入数组 return sum.apply(this,[num1,num2]);}alert(callSum1(10,19));alert(callSum1(10,19));
call() 方法与 apply() 方法的作用相同,他们的区别仅在于接收参数的方式不同。对于 call() 方法而言,第一个参数是 this 值没有变化,变化的是其余参数都直接传递给函数。即,在使用 call() 方法时,传递给函数的参数必须逐个列举出来。传递参数并非 apply() 和 call() 真正用武之地,它们真正强大的地方是能够扩充函数赖以运行的作用域。对象和方法不需要任何的耦合关系
- var color = "red";
- var o = {
- color: "blue"
- };
- function sayColor() {
- alert(this.color);
- } //在o作用于上执行,对象和方法不需要任何的耦合关系sayColor.call(o);
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: