高级函数

高级函数

安全的类型检测

  • js内置的类型检测并非完全可靠,typeof操作符难以判断某个值是否为函数
  • instanceof在多个frame的情况下,会出现问题。 
    例如:var isArray = value instance of Array ; 
    会由于存在多个window,而value与Array不属于同个window的情况而导致出错

对于这样的问题,最好的解决方法是通过调用Object的toString方法,例如:

1 function isArray(){
2     return Object.prototype.toString.call(value) == "[object Array]";
3 }

注意,这个技巧前提是Object.prototype.toString方法未被修改过

作用域安全的构造函数

调用构造函数的时候,如果忘记写new的话,构造函数中对this的赋值,则可能会赋值到window上成为全局变量,导致其他错误。 
可以在构造函数增加判断来避免这种错误,如下:

1 function Person(name){
2     if(this instanceof Person){
3         this.name = name;
4     }else{
5         return new Person(name)
6     }
7 }

惰性载入函数

在程序中 ,类似对浏览器的检测等,进行一次检测过后,只要在当前环境下,其检测结果都不会改变。所以,我们的函数中 if 语句只需要判断一次就可以了,而不需要每次都执行。 
对这种情况的解决方案便称为惰性载入。 
惰性载入表示函数执行的分支仅会发生一次。

惰性载入两种实现方法:
  • 替换真正执行的方法,伪代码如下:
  1. 1 function foo(){
    2     if(someCheck){
    3         foo =function(){doSomeThing()};
    4     }else{
    5         foo =function(){doAnotherSomeThing()};
    6     }
    7 }

  • 声明函数时就指定适当的函数。通过匿名自执行函数
  • 1 var foo =function(){
    2     if(someCheck){
    3         returnfunction(){doSomeThing()};
    4     }else{
    5         returnfunction(){doAnotherSomeThing()};
    6     }
    7 }();

这样,在代码首次载入的时候,就已经得到对应的值了

函数绑定

先看一个例子:

 1 var handler ={
 2     message:"handler message",
 3     handlerClick:function(event){
 4         console.log(this.message);
 5     }
 6 }
 7 //用于将某个函数绑定到指定环境
 8 var bind =function(fn, context){
 9     returnfunction(){
10         fn.apply(context, arguments);
11     }
12 };
13 var nomalBtn = document.getElementById("nomalBtn");
14 var bindBtn = document.getElementById("bindBtn");
15 nomalBtn.addEventListener("click", handler.handlerClick,false);//点击时候会打印 undefined
16 bindBtn.addEventListener("click", bind(handler.handlerClick,handler),false);//点击按钮会打印 handler.message的值

在上面的例子中,我们需要对象中的方法作为事件处理程序。但是,当事件触发时,this的指向却不是handler而是按钮本身。 
解决方法可以使用匿名函数,但是,过多的匿名函数会令代码变的难于理解与调试,因此,推荐使用bind方法。

ES5 为函数定义了一个原生的bind方法,也就是说,你不必自己实现bind方法,只需要直接在函数上调用即可handler.handlerClick.bind(handler) ;

函数科里化

函数科里化是用于创建已经设置好一个或多个参数的函数。缩小了函数的适用范围,但提高函数的适性。 
例如:

  

1 //普通的add版本
2 function add(num1, num2){
3     return num1 + num2;
4 }
5 //第一个参数为5的add版本
6 function curriedAdd5(num2){
7     return add(5, num2)
8 }

上面只是一个展示柯里化概念的例子。创建柯里化函数有一个通用方式:

1 function curry(fn, context){
2 //截取调用curry时候,除了fn,context,之后的所有参数
3     var args =[].slice.call(arguments,2);
4     returnfunction(){
5 //获取调用fn的所有参数
6         var totalArgs = args.concat([].slice.call(arguments));
7         return fn.apply(context, totalArgs);
8     }
9 }

这样,上面的例子中curriedAdd5可以用另一个方法来创建 var curriedAdd5 = curry(add, null, 5)

javascript中的柯里化函数和bind函数提供了强大的动态函数创建功能,但是两者都不应该滥用,因为每个函数都带来额外的开销

时间: 2024-10-01 03:05:49

高级函数的相关文章

什么是回调或高级函数?

http://blog.csdn.net/luoweifu/article/details/41466537    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以“存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值”. 因为function是内置对象,我们可以将它作为参数传递

Javascriptg高级函数

Javascript高级函数 惰性载入函数 函数柯里化 级联函数 这并不全面,只是几个主要的. 惰性载入函数 惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了. 写一个函数用来创建XmlHttpRequest对象,浏览器兼容性原因,写出的代码通过大量if判断或者try,catch语句将函数引导到正确代码处. 代码示例: function createXHR(){ var xh

第五天(全局变量,局部变量,高级函数)

在python中,没有缩进的变量为全局变量,推荐全部用大写字母. NAME = "aitg" def mz(): global NAME print(NAME) mz() 在代码块内部的变量为局部变量. def mz(): name = "aitg" print(name) mz() 局部变量还可以使用global方法指定为全局变量 NAME = "码农也疯狂" def mz(): global NAME NAME = "aitg&qu

python局部变量、高级函数、匿名函数、嵌套函数、装饰器

1.局部变量 在函数内部,可以用Global,显式的声明为全局变量.这种方式永远不要这么用. Ctrl+?多行注释i 2.高级函数 把函数名当做参数,传给函数 def add(a,b,f): return f(a)+f(b) res = add(3,-6,abs) abs是内置函数 def bar(): print("in the bar") def test1(func): 首先看第一个例子:def bar(): print("in the bar") def t

第33天pytho学习装饰器:高级函数部分演示

#迭代器:把列表变为迭代器# l=[1,3]# l1=iter(l)#转换成迭代器# print(l1)# print(next(l1))#——————转换成迭代器把第一个值取出来 #装饰器:本质就是函数:功能:为其他函数添加附加功能#原则:1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 #统计函数的时间# import time#添加个时间模块# def test(l):# start_time=time.time()#开始时间# res=0# for i in l:# time

numpy高级函数:where与extract

numpy高级函数:where与extract 1.numpy.where()函数,此函数返回数组中满足某个条件的元素的索引: import numpy as np x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("x") print(x) y=np.where(x>5) print(y) print(x[y]) 2.numpy.extract()函数,和where函数有一点相,不过extract函数是返回满足条件的元素

一篇文章把你带入到JavaScript中的闭包与高级函数

在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. function dada() { var a = 1; var b = function() { console.log(a); } return b // b 就是一个闭包函数,因为它能访问dada函数的作用域 } JavaScript的函数也是对象,可以有属性,可以赋值给一个变量,可以放在数组里作为元素

JavaScript系列:高级函数篇

前言: 本篇主要是介绍 JavaScript使用函数的高级方法,函数是JavaSCript中最有趣的部分,利用Function特性可以编写出很多非常有意思的代码,本篇主要包括:函数回调,高阶函数以及函数柯里化. 1.   函数回调 对于异步编程JavaScript API如SetTimeout或者JQuery的$.ajax又或者越来越火的Node.js编程,在事件循环上都是非阻塞的,意思就是,当你使用异步非阻塞API的使用,调用在回调函数执行之前立即返回,而这些回调在不久之后执行. 1 setT

python Day3 集合 文件处理 函数 字符编码 递归 高级函数

集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时