1,函数
是一些特定功能的代码组合
ECMScript 中的函数
本质上是一个对象
函数的名字是一个指向对象的指针
这决定了函数有两种不同的定义方法
2,声明方法定义函数
function fn(){}
3,函数表达式方法定义函数
可以定义为一个 Function 引用类型变量
var fn=new Function();
其中最后一个参数是函数体 前面的参数是函数的参数
var fn=new Function("a","b","console.log(a+b)")
undefined
fn(1,2)
VM101:3 3
可以简化为
var fn=function(a,b){
console.log(a+b)
}
undefined
fn(1,2)
VM165:2 3
4,使用函数声明方式定义的函数会被把函数体提到前面
fa(1,2)
function fa(a,b){
console.log(a+b)
}
VM253:6 3
5,使用函数表达式方法定义的函数,只会把声明提前,并用undefined 初始化,函数体并不会被提前,调用会报错
console.log("sum:"+sum);
sum(1,2);
var sum=function(a,b){
console.log(a+b)
};
VM476:1 sum:undefined
VM476:2 Uncaught TypeError: sum is not a function
at <anonymous>:2:1
(anonymous) @ VM476:2
6,执行
也叫调用
7,返回值
当函数没用定义返回值的时候 默认返回 undefined 作为返回值
用 return 定义返回值
8,参数
函数的参数的类型不确定
函数的参数个数不确定
用 arguments 来获取参数列表 会获得一个对象
var obj;
function sum(){
obj=arguments;
};
undefined
sum(1,2,3,4,5,6)
undefined
obj
参数是按值传递的
不会按引用传递
var zhi_1={
value:'我是值 zhi_1 这个变量的值 所描述的 地址 指向的 内存位置 所存储的东西!'
};
var zhi_2={
value:'我是值 zhi_2 这个变量的值 所描述的 地址 指向的 内存位置 所存储的东西!'
}
function change(zhi_1){
zhi_1.value=" zhi_2 是不会把值传给我的!"
zhi_1=zhi_2;
return zhi_1.value;
}
undefined
change(zhi_1)
"我是值 zhi_2 这个变量的值 所描述的 地址 指向的 内存位置 所存储的东西!"
zhi_1.value
" zhi_2 是不会把值传给我的!"
9,匿名函数
函数名只是一个指针
函数没了函数名 并不会对自身的功能造成什么改变 依然可以使用
匿名函数在编写回调函数时比较方便
尽量给匿名函数 加上名字
function sum(a,b,callback){
return callback(a,b)
}
undefined
sum
ƒ sum(a,b,callback){
return callback(a,b)
}
sum(1,2,function sum1(a,b){return a+b})
3
10,回调函数
就是把函数体本身作为参数传递给另一个函数
11,属性和方法
函数是一个特殊的对象 有自己的属性和方法
length 属性 就是在定义函数的时候所定义的参数的个数
和调用的时候传入的参数的个数无关
function fn (a,b,c){}
undefined
fn.length
3
A.call(B,a,b,c,...) 方法
function f1(a,b,c){
return a+b+c;
}
function f2(a,b){
return a+b;
}
undefined
f1.call(f2,1,2,3)
6
f2.call(f1,1,2,3)
3
在B方法的上下文 传入参数 a,b,c.. 执行 A方法
A.apply(B,[a,b,c,...])方法 和 call 类似 只是参数是放一起传入
A.bind(B,a,b,c,...) 并不会立即执行 而 call 和 apply 是立即执行的