zoukankan      html  css  js  c++  java
  • js中匿名函数和回调函数

    匿名函数:

    通过这种方式定义的函数:(没有名字的函数)

    作用:当它不被赋值给变量单独使用的时候

    1.将匿名函数作为参数传递给其他函数

    2.定义某个匿名函数来执行某些一次性任务

    var f = function (a) {
        return a;
    };
    

     回调函数:

    function invokeAdd(a, b) {
        return a() + b();
    }
    function one() {
        return 1;
    }
    function two() {
        return 2;
    }
    invokeAdd(one, two);
    //3
    

     也可以直接用匿名函数来代替:

    invokeAdd(function () { return 1; }, function () { return 2; });
    

     可读性更高的写法:

    invokeAdd(
        function () { return 1; },
        function () { return 2; }
    );

     还可以:

    invokeAdd(
        function () {
            return 1;
        },
        function () {
            return 2;
        });
    

    当将函数A传递给函数B,并由B来执行A时,A就成了一个回调函数(callback function),A如果是一个无名函数,就称为匿名回调函数

    回调函数的优势:

    1.可以让我们不做命名的情况下传递函数(节省变量名的使用)

    2.可以将函数调用操作委托给另一个函数(节省代码编写工作)

    3.有助于提升性能

    回调函数示例:

    需要将一个函数的返回值传递给另一个函数

    function multiplyByTwo(a, b, c) {
        var i,
        ar = [];
        for (var i = 0; i < 3; i++) {
            ar[i] = arguments[i] * 2;
        }
        return ar;
    }
    

     调用:

    multiplyByTwo(1,2,3);
    

     结果:

    [2, 4, 6]
    
    function addOne(a) {
        return a + 1;
    }
    

     调用:

    addOne(100);
    --101
    

     实现三个元素在两个函数之间的传递:

    1.定义另一个数组,用来存储来自第一步的结果

    var myarr = [];
    myarr = multiplyByTwo(10, 20, 30);
    

     2.循环遍历每一个元素,分别传递给addOne()

    for (var i = 0; i < 3; i++) {
        myarr[i] = addOne(myarr[i]);
    }
    

     调用:

    myarr;  
    [21, 41, 61]
    

     以上代码的缺点使用了两个循环,需要合二为一:

    function multiplyByTwo(a, b, c, callback) {
        var i, ar = [];
        for (var i = 0; i < 3; i++) {
            ar[i] = callback(arguments[i] * 2);
        }
    return ar;
    }
    

     调用:

    myarr = multiplyByTwo(1, 2, 3, addOne);
    

     用匿名函数来代替addOne(),可以节省一个额外的全局变量

    myarr = multiplyByTwo(1, 2, 3, function (a) { return a + 1;});
    

    即时函数:(在定义后立即调用)

    (
    function () {
        alert('boo');
    }
    )();
    

     只需要将匿名函数的定义放进一对括号中,然后外面紧跟一对括号即可。第二对括号起到“立即调用”的作用,也是我们向匿名函数传递参数的地方

    (
    function (name) {
        alert('Hello' + name + '!');
    }
        )('dude');
    

     使用匿名函数的好处是不会产生任何全局变量,缺点是这样的函数是无法重复执行的(除非放在某个循环或其他函数中),使的即时函数非常适合执行一些一次性的或初始化的任务

    内部私有函数:

    在一个函数中定义另一个函数

    function outer(param) {
        function inner(theinput) {
            return theinput * 2;
        }
        return 'The result is ' + inner(param);
    }
    

     改用函数标识法:

    var outer = function (param) {
        var inner = function (theinput) {
            return theinput * 2;
        };
        return 'The result is ' + inner(param);
    };
    

    结果:

    outer(2);  --The result is 4
    outer(8);  --The result is 16
    
    inner(2);  --inner is not defined
    

     使用私有函数的好处:

    1.有助于我们确保全局名字空间的纯净性

    2.确保私有性——只选择一些必要的函数暴露给“外部世界”,而保留属于自己的函数,不为该应用程序的其他部分所用

    返回函数的函数:

    function a() {
        alert('A');
        return function () {
            alert('B');
        };
    }
    
    var newFync = a();
    newFync();
    让返回的函数立即执行:
    a()();
  • 相关阅读:
    工作的开端五
    工作的开端一
    工作的开端四
    工作的开端三
    工作的开端二
    springMVC基础配置
    3
    2
    文件操作Utils方法1
    解压zip并解析excel
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/8469243.html
Copyright © 2011-2022 走看看