js之惰性函数

惰性函数是js函数式编程的另一个应用,惰性函数表示函数执行的分支只会在函数第一次调用的时候执行,他的应用情景在于当我们遇到一个需要判断场景去调用不同的方法时,避免重复进入函数内的if判断,也就是说if判断只进行一次,之后函数就会被分支里的代码替换掉

我们先看个例子

        function a(){
               console.log("this is a");
           }
           function a(){
               console.log("this is other a");
           }
           a(); //输出this is other a
        //同名函数被覆盖
 

在js中,不能存在同名函数,因为在创建词法作用域时,函数声明就会被提前,所以上面的例子中只输出this is other a。

我们再看下面这个例子

               function b(){
               console.log(‘b‘);
               b1 = function(){
                   console.log(‘other b‘);
               }
           }
           b(); // 执行第一个b函数
           b1();// 执行第二个函数

我们可以看见这里执行了连个函数,b和b1 如果把b1换成b的话,我们就可以达到重写b的目的,利用这步,我们就可以得到惰性函数

  function person(name){
                if(name=="jack"){
                    return  person = function(){
                        console.log("this is jack");
                    }
                }else if(name == "tom"){
                    return person = function(){
                        console.log("this is tom");
                     }
                    }else{
                    return person = function(){
                        console.log("this is others");
                }
           }
                }
                person("jack")();
                console.log(1);
                person();

这里我们可以看出来,当第一次执行完person函数后,他就被后面的person函数替代了,此时的person函数只剩下console这个输出了,这里就是一个惰性函数的小例子

那么惰性函数的实际应用在那里呢,我们可以从实际的dom操作中感受,添加监听事件的方法有两种,ie和其他的

function addEvent(type, element, fun) {
    if (element.addEventListener) {
        element.addEventListener(type, fun, false);
    }
    else if(element.attachEvent){
        element.attachEvent(‘on‘ + type, fun);
    }
    else{
        element[‘on‘ + type] = fun;
    }
}

这个函数会在每次运行时根据浏览器的不同选定相应的监听器,但每次运行时所有的代码都要跑一遍,这明显不够好,我们可以利用函数重写,当函数第一次运行时,我们就判断出来了浏览器支持哪种监听器,以后只要将方法替换当前的方法就可以了

function addEvent(type, element, fun) {
    if (element.addEventListener) {
        addEvent = function (type, element, fun) {
            element.addEventListener(type, fun, false);
        }
    }
    else if(element.attachEvent){
        addEvent = function (type, element, fun) {
            element.attachEvent(‘on‘ + type, fun);
        }
    }
    else{
        addEvent = function (type, element, fun) {
            element[‘on‘ + type] = fun;
        }
    }
    return addEvent(type, element, fun);
}

如上,就可以实现惰性函数的特性,只执行一次。

原文地址:https://www.cnblogs.com/maoxiaodun/p/10125081.html

时间: 2024-10-17 09:47:31

js之惰性函数的相关文章

JS 惰性函数 的简单案例

今天了解到一个新的名词叫惰性函数,在js中的重复计算可以省事很多 var add = function(a) { var e = a+a ; console.log("通道 1"); add = function(a) { console.log("通道 2") return e; }; return e; } alert(add(3)); // 通道1 弹出6 alert(add(5)); // 通道2 弹出6 alert(add(9)); // 通道2 弹出6

惰性函数——JS高级

原文地址:http://www.cnblogs.com/galenyip/p/4613430.html 我们先来看一下js的异步提交. XHR我们在原生的时候常常用到,因为常用到,我们更多把封装到了工具库中 先看下他最常用的实现 1 // 旧方法 2 3 function createXHR() { 4 var xhr; 5 try{ 6 xhr = new XMLHttpRequest(); 7 }catch(e) { 8 handleErr(e); 9 10 try { 11 xhr = n

JavaScript惰性函数定义

函数是js世界的一等公民,js的动态性.易变性在函数的应用上,体现的淋漓尽致.做为参数,做为返回值等,正是函数这些特性,使得js开发变的有趣. 下面就阐述一下,js一个有趣的应用--惰性函数定义(Lazy Function Definition). 惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了. 下面我们看几个典型的例子: 1 function addEvent (typ

【前端小小白的学习之路】---->用JS编写一个函数,返回数组中重复出现过的元素

用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: var arr = [1, 2, 3, 1, 2, 3, 4, 5]; var getRepeat = function (arr) { var obj = {}; for (var i = 0, len = arr.length; i < len; i++) { if (obj[arr[i]] == undefined) { obj[arr[i]] = 1; } else { obj[arr[i]]++; } } for (var

js中一些函数(一)【丫头, 今天去哪儿了呢,好些没有】

Math.Rondom()   ==>  0 到 1 之间的小数 Math.floor(x)  ==>  小于或者等于 x 的整数(即转换成整数后是不能比 x 大的整数) setInterval(hanshu,1000)  ==>  意思为调用下面的 hanshu(), 间隔时间为 1000 ms(毫秒) js中一些函数(一)[丫头, 今天去哪儿了呢,好些没有],码迷,mamicode.com

让js中的函数只有一次有效调用的三种常用方法

如何让js中的函数只被有效执行一次,请看下面的三种常用方法. 1. <script> window.onload = function () { function once(fn) { var result; return function() { if(fn) { result = fn.apply(this, arguments); fn = null; } return result; }; } var callOnce = once(function() { console.log('

JS多个函数之间传递参数问题

JS多个函数之间传递参数的一个重要思想是在页面定义一个隐藏域,当第一个函数请求到数据时候修改隐藏域的值,第二个函数用jQuery的选择器选择页面中隐藏域的值. 比如: 页面中定义一个隐藏的页号. <!-- 隐藏查询条件的页号 --> <input type="hidden" name="currentPage" id="currentPage"> 第一个ajax函数获取页面中的页号: function queryNum(c

JS中的函数、Bom、DOM及JS事件

本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的声明及调用] 1.函数声明的格式: function 函数名(参数1,参数2,参数3,--){//函数体 return 结果; } >>>函数的调用格式: 直接调用:函数调用的格式:函数名(参数一的值,参数二的值,--): 事件调用:事件名=函数名( ); 2.函数声明的几点强调: ①函数名

js中的函数

一.函数定义的方式 (1)普通方式 语法: function 函数名(参数){ 函数体 } Code: function method(){ alert("testMethod"); } method(); (2)匿名函数 语法:function(参数){ 函数体 } Code: var method = function(){ alert("yyy"); }; method(); (3)对象函数 语法:new Function(参数列表,函数体): 注意:参数名称