要想学好JavaScript除了基础的JavaScript知识点外,作为JavaScript的第一等国民——函数,我们要深切的相识。函数的多变来源于参数的天真多变和返回值的多变。假如参数是平常的数据类型或平常对象,如许的函数就是一般函数;假如函数的参数是函数,这就是我们所要晓得的高等函数;假如建立的函数挪用别的一部分(变量和参数已预置),如许的函数就是偏函数。
另外,另有一点就是可选参数(optional parameter)的运用。
函数的分类
- 一般函数
有函数名,参数,返回值,同名掩盖。示例代码以下:
function add(a, b) {
return a + b;
}
- 匿名函数
没有函数名,能够把函数赋值给变量和函数,或许作为回调函数运用。异常特别的就是马上实行函数和闭包。
马上实行函数示例代码以下:
(function(){
console.log(1)
})()
闭包示例代码以下:
var func = (function() {
var i = 1;
return function() {
console.log(i);
}
})()
- 高等函数
高等函数就是能够把函数作为参数和返回值的函数。如上面的闭包。ECMAScript中也供应大批的高等函数如forEach(), every(), some(), reduce()等等。
- 偏函数
function isType(type) {
return function(obj) {
return toString.call(obj) === "[object " + type + "]"
}
}
var isString = isType('String');
var isFunction = isType('Function');
置信,研讨过vue.js等罕见库源码的同砚不会生疏吧。
- 箭头函数
箭头函数不绑定自身的this,arguments,super。所以它不适合做要领函数,组织函数,也不适合用call,apply转变this。但它的特性就是更短,和处理匿名函数中this指向全局作用域的题目
window.name = 'window';
var robot = {
name: 'qq',
print: function() {
setTimeout(function() {
console.log(this.name);
}, 300)
}
};
// 修正1,用bind修正this指向
var robot = {
name: 'qq',
print: function() {
setTimeout(function() {
console.log(this.name);
}.bind(this), 300)
}
};
// 修正2,运用箭头函数
var robot = {
name: 'qq',
print: function() {
setTimeout(() => {
console.log(this.name);
}, 300)
}
};
想相识更多箭头函数能够看MDN
函数的参数
- 传入明白的参数
function add(a, b) {
reutrn a + b;
}
- 运用arguments对象
function add() {
var argv = Array.prototype.slice.apply(arguments);
return argv.length > 0 ? argv.reduce(function(acc, v) { return acc+=v}): '';
}
- 省略参数,参数默认值
function sub(a, b) {
a = a || 0;
b = b || 0;
return a - b;
}
- 对象参数
var option = {
width: 10,
height: 10
}
function area(opt) {
this.width = opt.width || 1;
this.height = opt.height || 1;
return this.width * this.height
}
对象参数比较罕见,常出现在jQuery插件,vue插件等中。
- 可选参数
ES5完成可选参数,我们须要运用arguments。运用指定局限的可选参数我们平常运用发对象参数,写过jQuery等插件的应当印象深入。
- ES6中的函数参数
在ES6中,参数默认值,省略参数操纵运用比较轻便。示例代码以下:
var area = (width=1, height=1) => width*height
在ES6中,运用可选参数。示例代码以下:
var add = (...nums) => {
var numArr = [].concat(nums)
return numArr.reduce((acc, v) => acc += v)
}
- 解构参数
myFunc = function({x = 5,y = 8,z = 13} = {x:1,y:2,z:3}) {
console.log(x,y,z);
};
myFunc(); //1 2 3 (默认值为对象字面量)
myFunc({}); //5 8 13 (默认值为对象自身)
函数的返回值
- 函数的返回值为基础数据类型,如字符串,数字,Boolean,null,undefined。示例代码以下:
function add(a, b) {
return a + b
}
- 函数的返回值为对象。示例代码以下:
function Robot(name) {
this.name = name
}
Robot.prototype.init = function() {
return {
say: function () {
console.log('My name is ' + this.name)
}.bind(this),
dance: function(danceName) {
console.log('My dance name is ' + danceName)
}
};
}
var robotA = new Robot('A');
robotA.init().say(); // "My name is A"
var robotB = new Robot('B');
robotB.init().say(); // "My name is B"
不管是写原生照样jQuery插件,亦或其他插件,这类状况都不少见。更深切的相识能够参考jQuery源码。
- 返回值为函数
这个我们最为熟习的莫过于闭包。详细可参考
陈词滥调之闭包
参考文章
JS: How can you accept optional parameters?
Named and Optional Arguments in JavaScript
How to use optional arguments in functions (with optional callback)
后续能够还会继承修正,也迎接列位批评指正。有题目或许有其他主意的能够在我的GitHub上pr。