5.5 function

实例

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
原文地址:https://www.cnblogs.com/caijw/p/8150938.html