学习JS的心路历程-函式(一)
前几天有间单提到该如何声明函式及在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的心路历程-函式(一)的更多相关文章
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- 学JS的心路历程-函式(二)arguments
参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...
- 学JS的心路历程-函式(六)其余参数及预设参数
今天我们要来介绍ES6新增的其余参数及预设参数! 其余参数rest parameter …numbers可以让我们表示不确定数量的参数,并将其视为一个数组: function getVal(…numb ...
- 学JS的心路历程-函式(五)箭头函式
箭头函式arrow function 为了能够以更简短的方式建立函式,ES6变推出了箭头函式. 用说明的可能会不太懂,我们先拿之前的数组排序例子来看: var arr = [2,1,6,12,3,77 ...
- 学JS的心路历程-函式(四)apply、call
从上一篇可以知道,不同的函式呼叫会造成this的不同,但我们能不能在呼叫时候明确指定呢? 当然可以.会有这个想法是因为往往在执行某支函式时想要用回呼函式(mizumisushi),但发现this总是显 ...
- 学习JS的心路历程-范围Scope和提升(Hoisting)
在上一篇提到了JS有三种声明变量的方式,分别是var.const及let,var和const let最大区别就是范围(scope)的限制.所以在这一篇我们会详谈何谓范围链及他们的复写优先级. 范围Sc ...
- 学习JS的心路历程-声明
变量 在程序中将一个值指定(assign)给一个符号式的容器(symbolic container),叫做一个变量(variable). 声明在JS中目前提供了三种声明方式: var 声明一个变量,可 ...
- 学习JS的心路历程-参数的传递(下)
今天我们要来探讨JS到底是透过何种参数传递方式呢? 废话不多说,上示例!! 我们先声明原始型别和物件型别来看看两者是否会有不一样的差异: var myStr = 'Hola': var myObj = ...
- 学习JS的心路历程-参数传递方式(上)
很多人认为JS的传递方式是值是Call by value, 物件及数组是Call by Reference.甚至还有人宣称其实JS是Call by sharing,那到底是哪一个呢? 这两天我们一一来 ...
随机推荐
- Django中的视图
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- 【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。
Eclipse中导入外部jar包 在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可. 工具/原料 Eclipse 需要 ...
- SpringBoot 实现前后端分离的跨域访问(CORS)
序言:跨域资源共享向来都是热门的需求,使用CORS可以帮助我们快速实现跨域访问,只需在服务端进行授权即可,无需在前端添加额外设置,比传统的JSONP跨域更安全和便捷. 一.基本介绍 简单来说,CORS ...
- jmeter分布式压力测试实践+登录为例
1.一张分布式压力的图解,如下 准备: 1.两台slave 2.一个master 3.待测目标地址 http://XXX 准备环境:linux环境,master如果可以最好有可视化电脑界面,便于jmx ...
- 蓝桥杯Java真题解析
上个月参加蓝桥杯省赛拿了个省一,自从比赛完之后就一直没怎么写代码了,还有一个多月就要国赛了,从现在开始准备下国赛,但是我也不想学什么算法,而且我还在准备考研,所以就打算只做下历年的真题,争取国赛拿个国 ...
- 零基础学习python_字符串(14-15课)
今天回顾下我之前学习python的第一个对象——字符串,这个对象真蛋疼,因为方法是最多的,也是最常见的类型,没有之一... 内容有点多,我就搜了下网上的资料,转载下这个看起来还不错的网址吧:http: ...
- Certbot免费https证书
安装https 获取certbot客户端 wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto 停止nginxyunx service ...
- 【Linux】【Jenkins】Jenkins安装和配置等
Jenkins配置详解: http://lib.csdn.net/article/git/18342 Jenkins介绍 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功 ...
- 第三周C++小结
其实一些经验或者技巧,都是在作业的过程中搜索得到或者自己领悟出来的. 首先是数值变量与字符变量占用的字节数不同,因此可以用sizeof()函数来判断变量所占字节数判断其类型. 然后是空格的ASCII码 ...
- 49.纯 CSS 创作一支诱人的冰棍
原文地址:https://segmentfault.com/a/1190000015257561 感想:重点在让色彩滚动起来->background-position: 0 1000vh; HT ...