一、函数声明和函数表达式
1.函数声明:JS引擎会把函数声明提升到顶部,所以即使声明函数的代码在调用它的代码后面也能正常运行。例:
init();
function init() {…};
2.函数表达式:必须等到解析器执行到它所在的代码行,才会真正的被解析执行,否则调用该方法会报错。例:
init();
var init = function() {…};
二、函数属性和方法
1.属性:每个函数都包含两个属性length和prototype。length属性表示函数希望接收的命名参数个数。prototype是保存所有实例方法的真正所在。
2.方法:每个函数都包含两个非继承而来的方法apply和call。ES6新增一个方法bind。
1)apply方法
apply方法接收两个参数,第一个参数是运行函数的作用域,第二个参数可以是Array实例,也可以是arguments对象。例:
①第二个参数是Array实例
function sum(num1, num2) { return num1 + num2
}
function callSum1(num1, num2) {
return sum.apply(this, [num1, num2]);
}
console.log(callSum1(10, 20)); // 30
②第二个参数是arguments对象
function sum(num1, num2) {
return num1 + num2
}
function callSum2(num1, num2) {
return sum.apply(this, arguments);
}
console.log(callSum2(10, 20)); // 30
2)call方法
call方法可以接收多个参数,第一个参数是运行函数的作用域,其余传递给函数的参数必须逐个列举出来(environment,p1,p2,…)。例:
function sum(num1, num2) {
return num1 + num2
}
function callSum(num1, num2) {
return sum.call(this, num1, num2);
}
console.log(callSum(10, 20)); // 30
3)bind方法
bind方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。例:
window.color = 'red';
var obj = { color: 'blue' };
function sayColor() {
alert(this.color);
}
var objSayColor = sayColor.bind(obj); // 创建一个函数的实例objSayColor
objSayColor(); // blue