实例
function sum(num1, num2){
return num1 + num2;
}
//函数表达式
var sum = function(num1, num2){
return num1 + num2;
}
函数名是指向函数的指针,一个函数可能有多个名字
function sum1(num1, num2){
return num1 + num2;
}
alert(sum1(1, 2));//3
var anotherSum = sum1;
l(anotherSum(10,10));//20
sum1 = null;
l(anotherSum(10,10));//20
5.5.1 没有重载(深入理解)
将函数名想象成指针
function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num){
return num + 200;
}
addSomeNumber(100)//300
var addSomeNumber = function(num){
return num + 100;
}
addSomeNumber = function(num){
return num + 200;
}
addSomeNumber(100);//300
创建第二个函数的时候,覆盖了引用第一个函数的变量addSomeNumber
5.5.2 函数声明与函数表达式
解析器解析的时候不是一视同仁:先读取函数声明,函数表达式要等解析器执行到它所在的代码行。
alert(sum1(10, 10));//20
function sum1(num1, num2){
return num1 + num2;
}
=====
alert(sum1(10, 10));//sum1 is not a function
var sum1 = function(num1,num2){
return num1 + num2;
}
5.5.3 作为值的函数
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
function add10(num){
return num + 10;
}
var result = callSomeFunction(add10, 10);
l(result);//20
function getGreeting(name){
return 'hello ' + name;
}
var result2 = callSomeFunction(getGreeting, 'cjw');
l(result2);//hello cjw
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;
}
}
}
var data = [{name:'Zachary',age:228},{name:'Nicholas',age:29}];
data.sort(createComparisonFunction('name'));
l(data[0]);
data.sort(createComparisonFunction('age'));
l(data[0]);
5.5.4 函数内部属性 arguments,this
arguments: 一个类数组对象包含传入函数的所有参数
arguments.callee: 指向拥有这个arguments对象的函数
this: 引用的是函数据以执行的环境对象
caller: 这个属性中保存着调用当前函数的函数的引用。
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * factorial(num-1);
}
}
l(factorial(5));
//不受函数名限制
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num - 1);
}
}
this
window.color = 'red';
var o = {color:'blue'};
function sayColor(){
l(this.color)
}
sayColor();//red
o.sayColor = sayColor;
o.sayColor();//blue
caller
function outer(){
inner();
}
function inner(){
l(inner.caller);//ƒ outer(){inner();}
}
outer();
function outer(){
inner();
}
function inner(){
l(arguments.callee.caller);
}
outer();
5.5.5 函数属性和方法(length,prototype, call,apply,bind)
length: 希望接受的命名参数的个数
prototype:保存所有实例方法的真正所在
call,apply: 扩充函数赖以运行的作用域
apply: 运行函数的作用域,接收数组
call:运行函数的作用域,接收参数
length
function sayName(name){
l(name);
}
function sum1(num1, num2){
return num1 + num2;
}
function sayHi(){
l('hi');
}
l(sayName.length);//1
l(sum1.length);//2
l(sayHi.length);//0
apply,call
function sum1(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum1.apply(this, arguments);
}
function callSum2(num1, num2){
return sum1.apply(this, [num1,num2]);
}
function callSum3(num1, num2){
return sum1.call(this, num1, num2);
}
l(callSum1(10, 10));//20
l(callSum2(10, 10));//20
l(callSum3(10, 10));//20
扩充函数赖以生存的作用域
window.color = 'red';
var o = {color: 'blue'};
function sayColor(){
l(this.color);
}
sayColor();
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue
bind:创建一个函数的实例,其this值会被绑定到传给bind()函数的值
window.color = "red";
var o = {color:"blue"};
function sayColor(){
l(this.color);
}
var objSayColor = sayColor.bind(o);
objSayColor();//blue