美文网首页程序员@IT·互联网
JavaScript函数式编程-闭包(四)

JavaScript函数式编程-闭包(四)

作者: 陈7号 | 来源:发表于2016-08-10 10:36 被阅读96次

什么是闭包
闭包就是能够读取其他函数内部变量的函数,由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。
环境由闭包创建时在作用域中的任何局部变量组成

闭包的意义

  1. 闭包允许将函数与其所操作的某些数据(环境)关联起来
  2. 可以用闭包模拟私有方法

注意
如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

看了很多闭包相关的资料,还是不知道怎么把闭包讲清楚,大概是自己的能力还有限,就先把看到的一些例子放进来,有时候可能看代码更容易理解一点,待我某天开窍了,好好写一写

示例

例一

function sayHello(name) {
    var text = 'Hello ' + name;
    var say = function() { console.log(text); }
    say();
}

例二

function sayHello2(name) {
    var text = 'Hello ' + name; // 局部变量
    var say = function() { console.log(text); }
    return say;
}
var say2 = sayHello2('Bob');
say2(); // 输出 "Hello Bob"

例三

function say667() {
    // Local variable that ends up within closure
    var num = 42;
    var say = function() { console.log(num); }
    num++;
    return say;
}
var sayNumber = say667();
sayNumber(); // logs 43

例四

var gLogNumber, gIncreaseNumber, gSetNumber;
function setupSomeGlobals() {
    // Local variable that ends up within closure
    var num = 42;
    // Store some references to functions as global variables
    gLogNumber = function() { console.log(num); }
    gIncreaseNumber = function() { num++; }
    gSetNumber = function(x) { num = x; }
}

setupSomeGlobals();
gIncreaseNumber();
gLogNumber(); // 43
gSetNumber(5);
gLogNumber(); // 5

var oldLog = gLogNumber;

setupSomeGlobals();
gLogNumber(); // 42

oldLog() // 5

例五

function buildList(list) {
    var result = [];
    for (var i = 0; i < list.length; i++) {
        var item = 'item' + i;
        result.push( function() {console.log(item + ' ' + list[i])} );
    }
    return result;
}

function testList() {
    var fnlist = buildList([1,2,3]);
    // Using j only to help prevent confusion -- could use i.
    for (var j = 0; j < fnlist.length; j++) {
        fnlist[j]();
    }
}

 testList() //logs "item2 undefined" 3 times

例六

function sayAlice() {
   var say = function() { console.log(alice); }
   // Local variable that ends up within closure
   var alice = 'Hello Alice';
   return say;
}
sayAlice()();// logs "Hello Alice"

例七

function newClosure(someNum, someRef) {
    // Local variables that end up within closure
    var num = someNum;
    var anArray = [1,2,3];
    var ref = someRef;
    return function(x) {
        num += x;
        anArray.push(num);
        console.log('num: ' + num +
            '\nanArray ' + anArray.toString() +
            '\nref.someVar ' + ref.someVar);
      }
}
obj = {someVar: 4};
fn1 = newClosure(4, obj);
fn2 = newClosure(5, obj);
fn1(1); // num: 5; anArray: 1,2,3,5; ref.someVar: 4;
fn2(1); // num: 6; anArray: 1,2,3,6; ref.someVar: 4;
obj.someVar++;
fn1(2); // num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;
fn2(2); // num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;

在前端摸爬滚打中,欢迎指正

相关文章

  • 【五十二】 underscore

    前面我们已经讲过了,JavaScript是函数式编程语言,支持高阶函数和闭包。函数式编程非常强大,可以写出非常简洁...

  • JavaScript函数式编程-闭包(四)

    什么是闭包闭包就是能够读取其他函数内部变量的函数,由于在Javascript语言中,只有函数内部的子函数才能读取局...

  • Javascript学习笔记-underscore

    JavaScript是函数式编程语言,支持高阶函数和闭包。你会发现Array有map()和filter()方法,而...

  • 几句话讲清 JS 闭包

    闭包 所有的函数式编程语言中,闭包的概念都尤为重要。Javascript 作为 github 上第一语言,是当今 ...

  • Kotlin 函数式编程思想 FP in Kotlin

    Kotlin 函数式编程思想 : FP in Kotlin 函数式编程特性 闭包和高阶函数 函数编程支持函数作为第...

  • 图解javascript this指向什么?

    JavaScript 是一种脚本语言,支持函数式编程、闭包、基于原型的继承等高级功能。JavaScript一开始看...

  • 闭包

    闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上...

  • JavaScript函数式编程

    读完《JavaScript函数式编程》《JavaScript函数式编程指南》这两本书,对JavaScript函数式...

  • JavaScript函数式编程

    读完《JavaScript函数式编程》《JavaScript函数式编程指南》这两本书,对JavaScript函数式...

  • GO学习笔记(12)-斐波那契数列与函数编程

    目录 函数指针 vs 函数式编程 闭包 斐波那契数列与函数接口 函数指针 vs 函数式编程 函数是go语言中的...

网友评论

    本文标题:JavaScript函数式编程-闭包(四)

    本文链接:https://www.haomeiwen.com/subject/dytjsttx.html