js之惰性函数

时间: 2018-12-16阅读: 1963标签: 函数

惰性函数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  

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/1612

javascript replace高级用法

在前端与后台交互的时候我们通常都需要将后台传递的数据绑定到html中,这个绑定数据的方式我们通常是使用jQuery或者使用原生的innerHTML进行绑定,当然也可以使用artTemplate模板来绑定数据,那么artTemplate模板它绑定数据的原理是什么呢?其实它就是利用了replace()方法。

Js中函数式编程

最近和做技术的朋友聊天的时候,发现自己居然不能将函数式编程思想讲清楚,于是做一次复习,常常都能听到这么一句话:在 JavaScript 中,函数是“一等公民”,这句话到底意味着什么?

js实现KB、MB、GB、TB单位转换

当函数参数值小于等于1000时,参数除以1000,即可得到最小单位kb,赋值给变量_integer;当_integer值大于1000时,kb值除以1000,即可得到mb,赋值给变量_integer;以此类推。

10个非常实用的Js工具函数

生成一周时间new Array 创建的数组只是添加了length属性,并没有实际的内容。通过扩展后,变为可用数组用于循环,类型判断判断核心使用Object.prototype.toString,这种方式可以准确的判断数据类型。

js中函数表达式和自执行函数表达式的用法总结

立即调用函数表达式:给函数体加大括号,在有变量声明的情形下,没有任何区别.但是,如果只是【自动执行】的情形下,就会不同,因为,一个匿名函数,不赋值或函数体不加小括号,是不能自动执行的

CSS的var()函数怎么用?

CSS中的var()函数可用于插入自定义属性(有时称为“css变量”)的值,而不是插入其他属性值的任何部分。随着sass,less预编译的流行,css也随即推出了变量定义var函数。var()函数,就如同sass和less等预编译软件一样,可以定义变量并且进行对应的使用。

js工厂函数创建对象与对象构造函数的理解

工厂函数,顾名思义,就是通过一个"工厂的加工" 来创建一个函数,这种操作在需要创建多个相似对象时可以有效地减少重复代码,但是这样有个缺点就是

js函数内部两个特殊的对象之arguments和this

arguments是一个类数组对象。包含着传入函数中的所有参数。但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。this引用的是函数执行的环境对象(当在网页的全局作用域中调用函数时,this对象引用的就是window)

理解与使用JavaScript中的回调函数

在JavaScript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回。

js中reduce()方法

reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当前元素值,当前索引,原数组。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!