接之前一篇的函数。写之前的函数的时候讲的比较笼统,在这重新写一下函数的内容。

函数:

  之前提过,函数就是代码复用的一种机制或是将代码封装成功能的代码段。函数的声明在这边就不多提了,因为相对来说比较简单。除了正常的函数声明之外,还有一种函数的声明方式,就是函数表达式。它的格式如下:

var fun=function(){
console.log("啦啦啦");
}
fun();

  先是用var关键字来定义一个变量,在等号的右边写一个匿名函数,匿名函数,顾名思义也就是没有名字的函数,匿名函数在调用的时候,是用变量名来加一个小括号的形式调用它。值得注意的是,在用函数表达式声明函数的时候记得要再花括号后加一个分号,不然程序有可能出现一些不可预知的错误。比如后面如果跟了个自执行函数的话,就有可能报错或者出现一些跟我们想的不一样的结果。

  这里提到了个自执行函数,那么什么是自执行函数呢?自执行函数是没有名字的,定义了之后马上调用的函数。这种函数多用于一次性使用的时候。它得格式如下:

(function () {
console.log("啦啦啦");
})(); //------------------------------分割线---------------------------
(function () {
console.log("哈哈哈");
}());

  第一眼看感觉有点复杂,那要怎么理解记忆呢?我们都知道,函数的调用是用函数名+括号的形式来调用的。那么单独使用函数名会输出什么结果呢?比如下面这段代码:

function fun(){
console.log("啦啦啦");
}
console.log(fun);

在控制台打印的结果为:

  由此我们可以知道,使用函数表达式定义函数之后,变量跟函数体是等价的。因此,自执行函数就很好记了,就是把以前写函数名的地方改成了函数体的形式,并且在外面加了一层括号来指定自执行函数的区域。自执行函数的好处就是不需要定义变量名,而且定义了之后马上调用。

  除此之外,函数还有很多其他的作用,比如函数还可以作为一个参数传入另一个函数之中。根据前面自执行函数演示的代码可以知道,当单独打印函数名的时候,会打印出整个函数体。函数是一种数据类型,如果用typeof来打印一下函数名的时候,会打印出一个function的值。

  比如下面这段代码,他在控制台输出的结果就是function。由此我们可以知道,函数是有数据类型的,并且它的类型是function。

function fun(){
console.log("啦啦啦");
}
console.log(typeof fun);

  因此,函数可以作为一个参数来传入另一个函数之中。那具体是怎么使用的呢?可以看下面的代码。

function getResult(a, b, fn) {
return fn(a, b);
}

  我们在getResult这个函数中定义了三个参数,a,b,fn。这三个参数都只是形参,因此可以是任意值。首先我们先分析一下这段代码,这段代码定义了一个函数名为getResult的函数。这个函数有三个参数a,b,fn。它的返回值是一个函数名为fn,参数为a,b的函数。

  在这里,我们把fn看成了一个函数来使用,并且把getResult函数中的形参a和b来当做fn函数中的实参。这样,我们就实现了把函数当做变量传入另一个函数中。在函数调用的时候,我们就可以用这种形式来表示:

var f1 = function(a,b){
return a*b;
}; console.log(getResult(15, 60, f1));

  在这里,我们先用函数表达式的方法定义了一个名叫fn的函数,并且把他当成参数传进了getResult函数中。函数执行的结果为900;这样,我们就已经完成了把函数作为一个参数传入另一个函数中。不过,这段代码还简化一下。

  因为在定义了函数之后,函数名跟函数体是等价的,所以,上面代码还可以简写成这样。

Console.log(getResult(15,60,function(a,b){
return a*b;
}));

  说完了这些,然后在说说JS中一些跟其他语言不同的地方,比如函数的重载,在JS中是没有函数重载的。既然说JS没有重载的话,就不得不提一下什么是重载了。所谓的重载就是函数名相同,但是函数的形参个数不同,或者形参的数据类型不同,这样就构成了函数的重载。

function getSum(a, b) {
return a - b;
}
function getSum(a, b, c) {
c = c || 0;
return a + b + c;
}
console.log(getSum(1, 2));

  比如说上面这段代码,程序运行的结果是3,为什么是3呢?在JS中,如果有重名的函数,那么后面的函数会将前面的函数覆盖掉。所以这段代码只会执行后面那个函数,而前面的函数则被后面的函数给覆盖掉了。

  还有一个就是作用域的问题,跟其他语言不同的是,JS中是没有块级作用域的,所谓的块级作用域,就是一个{}之间包裹的区间。但是,JS中有全局作用域和局部作用域。全局作用域就是同一个页面中的script标签之间的区域。在全局作用域中的变量是可以在任何地方都能访问到的。而局部作用域则是函数内部的作用域,在函数内部定义的变量则是局部变量。在这里,不得不提一点就是变量的赋值前都会有一个var关键字,如果在函数内部没有用var定义的变量,这个变量就会变成全局变量,会造成变量的污染。

 

JS入门(四)的更多相关文章

  1. 转:arcgis api for js入门开发系列四地图查询

    原文地址:arcgis api for js入门开发系列四地图查询 arcgis for js的地图查询方式,一般来说,总共有三种查询方式:FindTask.IdentifyTask.QueryTas ...

  2. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  3. Ember.js入门教程、博文汇总

    第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properti ...

  4. 让我们一起学习《Node.js入门》一书吧!

    Node.js入门 读完本书之后,你将完成一个完整的web应用,该应用允许用户浏览页面以及上传文件. 里面对一些知识的讲解,让你略窥Node.js的门径.最好一段代码一段代码的写下来,我的习惯是手里拿 ...

  5. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  6. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  7. d3.js 入门指南

    说到数据可视化,我们会行到很多优秀的框架,像echarts.highcharts,这些框架很优雅,健壮,能满足我们对可视化的大部分需求,但是缺点也很明显,就是这些框架几乎是不可定制化的,当遇到特殊的需 ...

  8. 极简 Node.js 入门 - 2.4 定时器

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  9. 1. web前端开发分享-css,js入门篇

    关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...

  10. JS入门之ActiveXObject对象(转载)

    JS入门之ActiveXObject对象   此对象提供自动化对象的接口.   function ActiveXObject(ProgID : String [, location : String] ...

随机推荐

  1. js原生设计模式——2面向对象编程之闭包2

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. IOS开发缓存机制之—本地缓存机制

    功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这 ...

  3. 如何测试LBS功能

    在LBS功能的开发中,为了保证通用性,服务器存在的坐标是基于wgs84的,这个通常由GPS设备传过来,对于PC来说,如何获得这个值呢?可以利用Google Earth来获得,并修改显示的坐标系统,“工 ...

  4. 纯CSS3实现不错的表单验证效果

    这是补充HTML5基础知识的系列内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四. ...

  5. iOS 环信消息撤回

    这两天在做环信的消息回撤,在网上找了许久没有这种案例,之后官方的一些方法,但是自己做,还是需要花点时间去整理,所以我决定等我把这个做好之后,分享给大家,如果做的不好多多指教,谢谢- 首先要实现消息撤回 ...

  6. Bootstrap入门(二十八)JS插件5:工具提醒

    Bootstrap入门(二十八)JS插件5:工具提醒 工具提示在使用过程中比较常见,但是实现起来有些麻烦,而bootstrap则很好地解决了这个问题. 我们来写一个简单的实例 先引入CSS文件和JS文 ...

  7. Nancy简单实战之NancyMusicStore(二):打造首页

    前言 继上一篇搭建好项目之后,我们在这一篇中将把我们NancyMusicStore的首页打造出来. 布局 开始首页之前,我们要先为我们的整个应用添加一个通用的布局页面,WebForm中母版页的概念. ...

  8. iOS多线程的七大对象理解

    1用面向对象的观点去理解,进程和线程,同步和异步,并行和串行,还有主线程的主队列,的七者关系 进程:程序不运行时就是一堆代码,运行时就是一堆的进程的组合,进程是程序运行的基本单位. 线程:线程是进程的 ...

  9. 从新手到高手c++全方位学习 pdf + 视频教程 共18章

    淘宝已经和谐了这个网站,原网址:https://item.taobao.com/item.htm?spm=a1z09.8149145.0.0.mb00D0&id=17350311256& ...

  10. 有关C#分部类型的一些叙述

    等待着元宵节的到来,过完元宵,这个年也算是过完了,也得开始出去挣钱了,过年回家感觉每个人都觉得很牛,只有自己太渣,为了避免年底再出现这样尴尬的局面,还是需要努力干活.争取当上CEO,赢取白富美,走上人 ...