创建函数的方法
var sum =function(){}
function sum(){}
函数名其实 是一个包含函数的指针!!!所以一个函数可以有多个名字。
在函数sum已经被赋值为Null时。kum仍然直线函数。
一、函数声明与函数表达式
函数声明会有一个函数声明提升的过程。在解析器读取的时候
console.log(sum(1,2)) //3 function sum(num1,num2) { return num1+ num2; } console.log(kum(1,2)); //kum is not a function var kum = function (num1,num2) { return num1+ num2; }
为什么会这样,就是因为函数声明提升的过程。
二、函数作为值
当把函数作为值传递的时候,传的是函数名 也就是指针,所以不加()
加()传递的就是函数执行后的结果了。
function callName(someFunction,someArgument) { return someFunction(someArgument); } function add10(num) { return num +10; } var result = callName(add10,10) console.log(result); //20 function getName(name) { return "hello " + name; } var result2 = callName(getName,"viven"); console.log(result2) //hello viven
三、函数的内部属性
arguments callee caller
arguments callee阶乘函数
function factorial(num) { if (num<1){ return 1; }else{ return num*arguments.callee(num-1); } } console.log(factorial(5)) //120 var factorial1 = factorial; console.log(factorial1(5)); //120 factorial =function (num) { return 0; }; console.log(factorial(5)) //0 console.log(factorial1(5)); //120
解除函数的耦合
caller 调用当前应用的函数的函数的引用
四、属性和方法
length
表示函数希望接受参数的个数
apply 传入两个参数 运行函数的作用域 和 参数数组,可以是Array实例,也可以是arguments对象
function sum(num1,num2) { return num1 +num2; } function callSum1(num1,num2) { return sum.apply(this,[num1,num2]); } function callSum2(num1,num2) { return sum.apply(this,arguments); } console.log(callSum2(1,2)) //3 console.log(callSum1(3,2)) //5
call 传入两以上个参数 运行函数的作用域 和 每一个参数
function sum(num1,num2) { return num1 +num2; } function callSum1(num1,num2) { return sum.call(this,num1,num2); } console.log(callSum1(3,2)) //5
var color ="red"; var o={color:"blue"}; function sayColor() { console.log(this.color); } sayColor(); //red sayColor.call(this); //red sayColor.call(o) //blue
var color ="red"; var o={ color:"blue", sayColor:function() { console.log(this.color); } }; o.sayColor(); //blue o.sayColor.call(window); //red o.sayColor.call(o) //blue