https://segmentfault.com/a/1190000012646488 https://yangbo5207.github.io/wutongluo/
说明:此处只是记录阅读前端基础进阶的理解和总结,如有需要请阅读上面的链接
一、两种函数声明方式
1)使用function声明
fn(); // function function fn() { console.log('function'); }
2)使用函数表达式,即使用var声明
fn(); // 报错 var fn = function() { console.log('function'); }
两种声明方法的区别:使用function声明的函数可以在函数声明以上或者以后任何地方使用,因为以function声明的函数在创建变量对象时就指向函数地址,而var声明的函数,在变量对象刚创建时指向undifined,在执行上下文执行阶段才指向函数地址,所以必须先声明后使用。上面的执行顺序相当于下图
var fn =undifined;//变量声明,初始值undifined fn();//未赋值就使用所以报错 var fn = function() { console.log('function'); }
二、匿名函数
没有函数名称的函数叫做匿名函数。匿名函数一般用来当做参数传入另一个函数
function setTimeOut(function() { console.log("1s后打印!") },1000 )
三、自执行函数与模块
ES5没有块作用域的概念,一般使用自执行函数来模仿模块
(function(){ .... })();
一个自执行函数,也就是一个模块往往可以包括:私有变量、私有方法、公有变量、公有方法。一般模块外面访问不了模块里面的变量和方法,但是可以用闭包把方法或变量暴露给外面,变成公有方法和公有变量
(function() { // 私有变量 var age = 20; var name = 'Tom'; // 私有方法 function getName() { return `your name is ` + name; } // 共有方法 function getAge() { return age; } // 将引用保存在外部执行环境的变量中,形成闭包,防止该执行环境被垃圾回收 window.getAge = getAge; })();
四、函数的特性
1)函数是第一等公民
函数与别的数据类型一样,可以赋值给其他变量,也可以当做参数传递给另一个,还可以当做函数的返回值
var a = function foo() {} // 赋值 function fn(function() {}, num) {} // 函数作为参数 // 函数作为返回值 function var() { return function() { ... ... } }
2)只用"表达式",不用"语句"
"表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
function setBackgroundColor(ele, color) { ele.style.backgroundColor = color; return color; } // 多处使用 var ele = document.querySelector('.test'); setBackgroundColor(ele, 'red'); setBackgroundColor(ele, '#ccc');
3)纯函数
相同的输入总是得到相同的结果,并且不会改变原数据的函数叫做纯函数
function getLast(arr) { return arr[arr.length]; } function getLast_(arr) { return arr.pop(); } var source = [1, 2, 3, 4]; var last = getLast(source); // 返回结果4 原数组不变,纯函数 var last_ = getLast_(source); // 返回结果4 原数据最后一项被删除,不是纯函数
4)闭包、柯里化