前几天有间单提到该如何声明函式及在Hositing中会发生什么事,但是函式的奥妙不仅于此。

身为一个使用JS的工程师,我们一定要熟悉函式到比恋人还熟!

这几天将会把函式逐一扒开跟各位一起探讨其中的奥妙。

函式是头等物件

这句话代表着函式与任何JS物件共存,也被当成一个物件。

函式可以被当成变量引用、用实值作声明,或是作为函式参数传递。

这个我们在前几天虽然有提到,但并没有说为什么函式可以这样作,今天就有说明到是因为头等物件所造成的,也让大家复习一下:

//实质建立

function myFun(){}

//指派给变量、数组或其他物件属性

var myFun = function(){};

var myArr = [];

myArr.push(function(){});

var myObj = {};

myObj.funA = function(){};

//作为参数传递给其他函式

function myFun(val){

val();

}

myFun(function(){});

//作为函式的回传值

function myFun(){

return function(){}

}

//动态建立和指派属性

var myFun = function(){};

myFun.data =“Hola”;

回呼函式Callback function

头等物件的其中一样特性,可以作为参数传递给函式,而在某个时间点,可能会呼叫这个被传入的函式,这就是「回呼函式」的概念。

每当我们设置一个准备在之后呼叫的函式,不论是透过浏览器的事件处理阶段或是透过其他代码,这个行为就是在设置一个回呼函式。我们可以这样解释:这个被建立的函式,会在稍候某个适当的时机点,由其他代码「回呼」(call back)。

这会或还是有点难以理解,不过你或许已经使用过回呼函式只是你不知道而已,不论是最简单的按钮按下执行程序还是从服务器接收数据,这都是回呼函式!

我们来看一个最简单的示例:

var text = 'get Text';

function unlessFun(callback){

console.log('In unlessFUn');

return callback();

}

function getText(){

console.log('In getTxt function');

return text;

}

unlessFun(getText);

执行后会得到如下图:

或许你认为我直接在unlessFun里面印出text就好了啊,为什么要用回呼函式多此一举。

那也许接下来这个示例会让你体验到回呼函式的美好:

如果我们今天有一组数字[2,1,6,12,3,77,100,4]需要做比较大小,这时候可能很多人就会开始自己写个算法的函式,像是这样:

var arr = [2,1,6,12,3,77,100,4];

function compare(val){

for(let i = 0;i<val.lenght;i++){

}

}

也许你花了好几天终于写出了这个算法,但是其实我们可以发现JS早就帮你写好了一个sort()函式,

你可以拿来用,只需要写好回呼函式:

var arr = [2,1,6,12,3,77,100,4];

arr.sort(function(a,b){

return a - b;

});

console.log(arr);//[1,2,3,4,6,12,77,100]

我们不需要考虑算法的底层细节,JS早就针对这些算法函式进行最佳化了,没有必要重复造轮子而且造出来的性能还不一定比较好,所以学好回呼函式并使用他们吧!

参考资料:

忍者Javascript开发技巧探讨

学习JS的心路历程-函式(一)的更多相关文章

  1. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  2. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  3. 学JS的心路历程-函式(六)其余参数及预设参数

    今天我们要来介绍ES6新增的其余参数及预设参数! 其余参数rest parameter …numbers可以让我们表示不确定数量的参数,并将其视为一个数组: function getVal(…numb ...

  4. 学JS的心路历程-函式(五)箭头函式

    箭头函式arrow function 为了能够以更简短的方式建立函式,ES6变推出了箭头函式. 用说明的可能会不太懂,我们先拿之前的数组排序例子来看: var arr = [2,1,6,12,3,77 ...

  5. 学JS的心路历程-函式(四)apply、call

    从上一篇可以知道,不同的函式呼叫会造成this的不同,但我们能不能在呼叫时候明确指定呢? 当然可以.会有这个想法是因为往往在执行某支函式时想要用回呼函式(mizumisushi),但发现this总是显 ...

  6. 学习JS的心路历程-范围Scope和提升(Hoisting)

    在上一篇提到了JS有三种声明变量的方式,分别是var.const及let,var和const let最大区别就是范围(scope)的限制.所以在这一篇我们会详谈何谓范围链及他们的复写优先级. 范围Sc ...

  7. 学习JS的心路历程-声明

    变量 在程序中将一个值指定(assign)给一个符号式的容器(symbolic container),叫做一个变量(variable). 声明在JS中目前提供了三种声明方式: var 声明一个变量,可 ...

  8. 学习JS的心路历程-参数的传递(下)

    今天我们要来探讨JS到底是透过何种参数传递方式呢? 废话不多说,上示例!! 我们先声明原始型别和物件型别来看看两者是否会有不一样的差异: var myStr = 'Hola': var myObj = ...

  9. 学习JS的心路历程-参数传递方式(上)

    很多人认为JS的传递方式是值是Call by value, 物件及数组是Call by Reference.甚至还有人宣称其实JS是Call by sharing,那到底是哪一个呢? 这两天我们一一来 ...

随机推荐

  1. python—正则表达式

    我们平时上网的时候,经常需要在一些网站上注册帐号,而注册帐号的时候对帐号信息会有一些要求. 比如: 上面的图片中,输入的邮件地址.密码.手机号 符合要求才可以注册成功. 我们是我们自己写的网站,那么我 ...

  2. MySQL高可用架构之基于MHA的搭建

    一.MySQL MHA架构介绍: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Fa ...

  3. SP694 DISUBSTR - Distinct Substrings

    /* 统计每个节点的max和min, 然后求和即可 min = max[fa] + 1 */ #include<cstdio> #include<algorithm> #inc ...

  4. es6基础(1)--声明

    function test(){ //let只在块作用域有效 for(let i=1;i<3;i++){ console.log(i); } //es6严格模式,变量未声明,不可以用 //con ...

  5. Call requires permission which may be rejected by user: code should explicitly check to see if permi

    Call requires permission which may be rejected by user: code should explicitly check to see if permi ...

  6. SAP生产机该不该开放Debuger权限(转)

    前段时间公司定制系统在调用SAP RFC接口的时候报错了,看错误消息一时半会儿也不知道是哪里参数数据错误,就想着进到SAP系统里面对这个接口做远程Debuger,跟踪一下参数变量的变化,结果发现根本就 ...

  7. 49.纯 CSS 创作一支诱人的冰棍

    原文地址:https://segmentfault.com/a/1190000015257561 感想:重点在让色彩滚动起来->background-position: 0 1000vh; HT ...

  8. spark 运行架构

    spark 运行架构基本由三部分组成,包括SparkContext(驱动程序),ClusterManager(集群资源管理器)和Executor(任务执行过程)组成. 其中SparkContext负责 ...

  9. 32. 安装oracle11g时,先决条件一直失败的解决方法

    解决方法:1. 在命令提示符下 net share c$=c: 补充: 如果这个命令提示错误:“发生系统错误 5,拒绝访问的时候”,那我们可以修改注册表,检查AutoShareServer和AutoS ...

  10. Retrofit添加自定义转换器

    Retrofit2开始支持多种 Converter 并存,在之前,如果你遇到这种情况:一个 API 请求返回的结果需要通过 JSON 反序列化,另一个 API 请求需要通过 proto 反序列化,唯一 ...