JS入门(四)

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

函数:

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

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定义的变量,这个变量就会变成全局变量,会造成变量的污染。

 

时间: 2024-07-29 12:10:22

JS入门(四)的相关文章

React.js 基础入门四--要点总结

JSX语法,像是在Javascript代码里直接写XML的语法,实质上这只是一个语法糖,每一个XML标签都会被JSX转换工具转换成纯Javascript代码,React 官方推荐使用JSX, 当然你想直接使用纯Javascript代码写也是可以的,只是使用JSX,组件的结构和组件之间的关系看上去更加清晰. 1. HTML 标签 和 React 组件 在JS中写HTML标签,也许小伙伴们都惊呆了,那么React又是怎么区分HTML标签,React组件标签? HTML标签: var myDivEle

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

第一章 对象模型 Ember.js 入门指南——类的定义.初始化.继承 Ember.js 入门指南——类的扩展(reopen) Ember.js 入门指南——计算属性(compute properties) Ember.js 入门指南——观察者(observer) Ember.js 入门指南——绑定(bingding) Ember.js 入门指南——枚举(enumerables) Ember.js 入门指南之七第一章对象模型小结 第二章 模板 Ember.js 入门指南——handlebars基

Ember.js 入门指南——属性传递

1,传递参数到组件上 每个组件都是相对独立的,因此任何组件所需的数据都需要通过组件的属性把数据传递到组件中. 比如上篇<Ember.js 入门指南--组件定义>的第三点"{{component item.pn post=item}}"就是通过属性post把数据传递到组件foo-component或者bar-component上.如果在index.hbs中是如下方式调用组件那么渲染之后的页面是空的. {{component item.pn}} 请读者自己修改index.hbs

[WebGL入门]四,渲染准备

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 必须准备的东西 上次介绍了3D绘图的基础知识.讲了一下由Z坐标的不同决定的两种坐标系,以及坐标变换的种类.这一次,说一说实际WebGL绘图的时候必须准备的东西. 首先,HTML,javascript相关的基础知识就不解释了.如果,有不明白的单词或概念的话,请自己查一下.我是认为你有一定的HTM

Ember.js 入门指南——总目录

Ember.js 是什么?我想对于想学习它的人应该知道它是个什么东西,如果你想了解那就赶紧去 Google 或者百度,本系列教程是通过学习官网教程然后摘抄个人觉得比较重要的部分,加上学习实例整合而成,如有疏漏欢迎提出修改意见,一起成长! Ember官网:http://emberjs.com/ 教程官网:http://guides.emberjs.com/v2.0.0/ 在此简单介绍下 Ember: Ember是一个雄心勃勃的Web应用程序,消除了样板,并提供了一个标准的应用程序架构的JavaSc

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

静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览器,调试浏览器F12,我用的是Chrome,打开网络监听,示意如下,比如知乎,点登录之后,我们会发现登陆之后界面都变化了,出现一个新的界面,实质上这个页面包含了许许多多的内容,这些内容也不是一次性就加载完成的,实质上是执行了好多次请求,一般

玩转Node.js(四)-搭建简单的聊天室

玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一些个教程使用它来搭建一个超级简单的聊天室. 初始化项目 在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化: $ npm init 然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下: 1 $ ca

【 D3.js 入门系列 --- 9.6 】 打包图的制作

本人的个人博客为:www.ourd3js.com csdn博客为:blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 打包图( Pack ),用于包含与被包含的关系,也表示各个对象的权重,通常用一圆套一圆来表示前者,用圆的大小来表示后者. 先看本节所使用的数据:  city2.json 这是各城市所属关系的数据.我们现在要用 D3 的 layout 来转换数据,使其容易进行可视化处理. var pack = d3.layout.pack() .size([ width, heigh

Java使用Protocol Buffers入门四步骤

Protocol Buffers(简称protobuf)是谷歌的一项技术,用于将结构化的数据序列化.反序列化,经常用于网络传输. 这货实际上类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,可读性比XML差.类似的还有json.Java的Serializable等. protobuf支持各种语言.本文以Java为例,简单介绍protobuf如何使用.其他语言使用方法类似. 首先需要下载: http://download.csdn.net/downlo

Node.js入门:前后端模块的异同

通常有一些模块可以同时适用于前后端,但是在浏览器端通过script标签的载入JavaScript文件的方式与Node.js不同.Node.js在载入到最终的执行中,进行了包装,使得每个文件中的变量天然的形成在一个闭包之中,不会污染全局变量.而浏览器端则通常是裸露的JavaScript代码片段.所以为了解决前后端一致性的问题,类库开发者需要将类库代码包装在一个闭包内.以下代码片段抽取自著名类库underscore的定义方式. 1 (function () { 2 // Establish the