Function类型
Function类型
1 函数声明语法:
//方法一 function sum (num1, num2) { return num1 + num2; } //方法二 var sum = function(num1, num2) { return num1 + num2; }; //不要忘了分号
注意,函数名是指向函数的指针,与其包含对象的指针没有什么不同。
由于ECMAScript中的函数可以传入多个参数,因此并没有重载。
2 函数声明与函数表达式
解释器会先读取函数声明,使其在执行任何代码之前可用(函数声明提升),函数表达式则必须等到解释器执行到它所在的代码行,才会真正被解释执行。例:
alert(sum(10, 10)); //函数表达式 function sum(num1, num2) { return num1 + num2; } //函数声明
以上代码能被正确执行,因为函数声明被优先读取并添加到执行环境。
3 作为值的函数
可以像传递参数一样把一个函数传递给另一个函数,传递的是函数指针,不能带括号
function callSomeFunction(someFunction, someArgument) { return someFunction(someArgument); }
可以在一个函数中返回另一个函数
unction 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; } }; } var data = [{name : "Zchary", age : 28}, {name : "Nicholas", age : 29}]; data.sort(createComparisonFunction("name")); alert(data[0].name); //Nicholas data.sort(createComparisonFunction("age")); alert(data[0].name); //Zachary
4 函数内部属性
4.1 auguments
arguments是个数组对象,包含着传入函数的参数。它有一个callee属性,是个指向函数本身的指针。
var factorial(num) { if (num <= 1){ return num; } return num * factorial(num-1); //当函数名改变时,这个语句也要改变,否则函数失效 } var factorial(num) { if (num <= 1) { return num; } return num*arguments.callee(num-1); //此时与函数名无关,改变函数名函数也生效 }
4.2 this
this是对调用函数的对象的引用。当在全局作用域调用函数时,this引用的是window。
window.color = "red"; var o = {color : "blue"}; function sayColor() { alert(this.color); } sayColor(); //"red",此时this引用window o.sayColor = sayColor(); o.sayColor(); //"blue",此时this引用o
4.3 caller
这是ES5规范化的一个属性,它保存着调用当前函数的函数的引用。
function outer() { inner(); } function inner(){ alert(inner.caller); } outer(); //警告框中显示outer()的源代码
5 函数属性和方法
5.1 每个函数都包含两个属性:
- length:表示函数希望接收的命名参数的个数,如:
function sayName(name) { alert(name); } function sum(num1, num2) { return num1 + num2; } function sayHi() { alert("Hi); } alert(sayHi.length); //0 alert(sayName.length); //1 alert(sum.length); //2
- prototype:对于引用类型,prototype是保存它们所有实例方法的真正所在。它不可以枚举
5.2 每个函数都含有两个非继承而来的方法
- 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
- call():与apply()相同,只是传入参数方式不同:第一个是this, 其余参数都是直接传递给函数。
function sum(num1, num2) { reutnr num1 + num2; } function callSum(num1, num2) { return sum.call(this, num1, num2); } alert(callSum(10, 10)); //20
优点:使用call()或apply()可以扩充函数赖以运行的作用域,使对象与方法不需要有任何耦合。
window.color = "red"; var 0 = {color : "blue"}; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(window); //red sayColor.call(o); //blue
bind()方法:创建一个函数实例,其this值会被绑定到传递给bind()函数的值。
支持的浏览器:IE9++,Firefox4+, Safari5.1+,Opera12+和Chrome
window.color = "red"; var o = { color : "blue"}; function sayColor() { alert(this.color); } var objectSayColor = sayColor.bind(o); objectSayColor(); //blue

浙公网安备 33010602011771号