摘要:函数的分类普通函数有函数名,参数,返回值,同名覆盖。示例代码如下解构参数默认值为对象字面量默认值为对象本身函数的返回值函数的返回值为基本数据类型,如字符串,数字,,,。示例代码如下函数的返回值为对象。
要想学好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。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/93236.html
摘要:好程序员前端培训入门之基础知识梳理汇总,前端工程师是当前各大企业都比较稀缺的人才,薪资待遇和就业前景都很不错。作用域链的前端,始终是当前执行代码所在环境的变量对象。 好程序员Web前端培训入门之JS基础知识梳理汇总,Web前端工程师是当前各大企业都比较稀缺的人才,薪资待遇和就业前景都很不错。不论是专业还是非专业,有基础亦或是无基础,都想通过学习Web前端实现高薪就业。不过,学习要一...
摘要:好程序员前端培训入门之基础知识梳理汇总,前端工程师是当前各大企业都比较稀缺的人才,薪资待遇和就业前景都很不错。作用域链的前端,始终是当前执行代码所在环境的变量对象。 好程序员Web前端培训入门之JS基础知识梳理汇总,Web前端工程师是当前各大企业都比较稀缺的人才,薪资待遇和就业前景都很不错。不论是专业还是非专业,有基础亦或是无基础,都想通过学习Web前端实现高薪就业。不过,学习要一...
摘要:在此例中,在匿名函数被返回后,它的作用域链初始化为包含函数的活动对象和全局变量对象。函数在执行完毕后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象,结果就是只是的执行环境的作用域链会被销毁,其活动对象会留在内存中。 写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,...
摘要:构造函数调用会使用新创建的对象作为调用上下文。函数的参数相关可选形参当传入的实参比函数声明时指定的形参数量要少,剩下的形参都将设置为值实参多则会自动省略。它们的第一个实参是要调用函数的母对象,它是调用上下文,函数体内通过引用它。 写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,感谢它们的...
摘要:函数表达式的分类匿名函数表达式具名函数表达式自调用函数表达式函数表达式的用法使用来接偶函数名和函数体的耦合状态。修改函数表达式代码如下闭包我们知道,函数表达式是将匿名函数赋值给一个变量,作为变量的值,所以,匿名函数也可以作为的返回值。 这篇文章要介绍的内容是函数表达,因为我个人比较喜欢使用函数表达式定义函数,所以就对它做了一些研究和整理。其实,说到函数表达式,就不得不说到定义函数的另一...
阅读 3516·2021-09-27 13:35
阅读 3555·2019-08-29 17:09
阅读 2424·2019-08-26 11:30
阅读 697·2019-08-26 10:32
阅读 531·2019-08-26 10:23
阅读 1193·2019-08-26 10:20
阅读 3148·2019-08-23 15:26
阅读 3548·2019-08-23 14:33