前端基础进阶(七):函数与函数式编程

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)闭包、柯里化

原文地址:https://www.cnblogs.com/lidaying5/p/8574508.html