javaScript函数

js函数

函数介绍

什么是函数

函数就是将一堆代码进行重用的一种机制或者封装某种功能的代码段。

函数就是一段代码,这段代码可能有输入的值(参数),可能会有返回值

一个函数就像一个专门做这件事的人,我们调用它来做一些事情,它可能需要我们提供一些数据给它,

它执行完成后可能会有一些执行结果给我们。需要的数据就叫参数,返回的执行结果就是返回值


定义函数的方式

使用函数声明的方式来定义函数

function  函数名称([参数...]){
  函数体;
}

函数名称();  // 函数只要调用就会回到函数声明的内部执行里面的代码

示例

例如:
function tellStory(){
   console.log("从前有座山");
   console.log("山里有座庙");
   console.log("庙里有个老和尚");
   console.log("在给小和尚讲故事");
   console.log("讲的是什么呢?");
}

tellStory();// 调用函数

函数的三要素

  1. 函数名称

    一般在函数的名称上就可以体现这个函数的功能,函数名一般是一个动词

  2. 参数

    • 形参 定义函数时写在括号中的变量叫做形参,起占位置的作用,只能函数内部使用

    • 实参 调用函数时,传入的真正数据叫做实参,是一个真正的数据值

  3. 返回值

    js中的函数特别奇葩,js中的函数只要调用就会有返回值(包含undefined)

    • 如果函数没有显示的使用 return语句 ,那么函数会有默认的返回值:undefined

    • 如果函数使用 return语句,那么跟在return后面的值,就成了函数的返回值

    • 如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined

    • 函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。


函数内部可以调用另外一个函数

示例

function f1(){
  console.log('11111111111');
  console.log('11111111111');
  f2();
  console.log('11111111111');
  console.log('11111111111');
}
function f2(){
  console.log('2222222222222');
  console.log('2222222222222');
  console.log('2222222222222');
  console.log('2222222222222');
}
f1();

return关键字的用法

  1. 如果函数内部使用了return关键字,而且return后面跟着具体的数据,则return会先将数据返回,然后再跳出当前函数,return后面的代码不会再执行

  2. 如果函数内部使用了return关键字,但是return后面没有跟着具体的数据,则return会直接跳出函数,return后面的代码不会执行

  3. 也就说,如果有函数内部使用了return而且有具体的返回值,则return会先将数据返回,然后再跳出当前函数,如果没有具体的返回值,则return直接跳出函数

  4. 无论函数内部有没有数据需要返回,只要是有return关键字,最终都会跳出当前函数


定义函数的另一种方式

使用函数表达式的方式来定义一个函数,是将一个匿名函数存在一个变量当中

匿名函数多用于注册事件或定时器当中。

var fn = function(){
  console.log('我是一个匿名函数,存在于一个变量fn当中')
}
fn();// fn就相当于是这个匿名函数的函数体

两种方式的区别

  • 区别在于预解析,函数声明的方式定义的函数,在哪里都可以调用;

  • 而函数表达式的方式定义的函数必须在函数表达式的后面才可以进行调用.


预解析

js里面有一个特殊的机制,叫预解析,就是在js真正的执行代码之前,会将所有的js代码先扫描一遍,将代码中函数的声明,和变量的声明提升到当前作用域的最前面,而变量的赋值还是在原位置进行,这个过程就是预解析的过程,此我程我们看不到。


作用域

作用域可以理解为数据的使用范围

全局作用域

一对script标签之间就是一个全局作用域

  • 全局作用域不可以访问局作用域中的数据

  • 在全局作用域使用var声明的变量或在函数内部不使用var声明的变量,都是全局变量。

局部作用域

函数大括号内部就是一个局部作用域

  • 局部作用域可以访问全局使用域中的数据

  • 在函数内部使用var声明的变量就是局部变量。

块级作用域 :

在其它语言中,任何一对花括号中的语句都属于一个块,在这之中定义的所有变量在代码块外都是不可见的 JavaScript中没有块级作用域.


全局变量:

定义在页面中一对script标签之间或者不属于某个函数的变量.

在函数内部不使用var 声明的变量.

局部变量:

在函数内部使用var声明的变量

其它:

函数内部可以访问到该函数所属的外部作用域的变量(作用域链) 不使用var声明的变量是全局变量,不推荐使用。 变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁。


回调函数

把函数当做参数来传递,这样的函数称为回调函数

var f1 = function(){
  console.log('123')
}

function f2(fn){
  fn(); // 调用传进来的函数
}

f2(f1);// 此时f1就是一个回调函数

匿名函数

**定义: **

没有名字的函数就称为匿名函数

作用:

一般用于绑定事件或是定时器当中

例:

var fn = function(){
   console.log(123);
}

setTimeout(function(){
   console.log(456);
},1000)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于msg的文章目中处理Error Msg的方法小结不针对任何人的说: 看到有人把Error Msg写死到代码里,我就有上去忽他一巴掌的冲动。比如如下代码: int funcFoo() { UpdateData(); int error_code = 0; if (!IsInPutsUseName()) error_code = -1; else if(!IsInputAllPsw()) error_code = -2; else if(!IsTwoPswTheSame()) error_code = -3; else if(!IsThePswMachWithDatabase()) error_code = -4; if (error_code != 0) { switch(error_code) { case -1 : MessageBox("请输入用户名,然后重试!", "未输入用户名", MB_OK | MB_ICONWARNING); break; case -2 : MessageBox("请输入所有的密码,然后重试!", "未输入密码", MB_OK | MB_ICONWARNING); break; case -3 : MessageBox("您输入的两次密码不一致,请重新输入!", "密码不一致", MB_OK | MB_ICONWARNING); break; case -4 : MessageBox("您输入的密码错误,请重新输入", "密码错误", MB_OK | MB_ICONWARNING); break; case default : break; } DeleteInputPsw(); return error_code; } UpdateData(false); return error_code; } 理由如下: 1. 这样的源码不易阅读。假设用户提供的一个错误信息,我要追踪其源码,我去那里找呀?可能有很多处地方都会有重复的类似的MSG出现,比如"请输入用户名,然后重试!"和"请您输入用户名,然后重试!"就会被认为是2条不同的MSG。这样很难排错。 2. 用户那里有可能弹出你估计之外的错误。实际上我们经常遇到这种情况,某程序崩溃探出一个错误号,没信息。因为没有对应好。 3. 不利于发展为多语言版本?(你指望专业翻译在你的代码里搜索字符串?) 4.不利于全局统计。估计自己都不知道自己的工程里已经存在了多少种MSG字符串了吧? 5.专业软件的错误信息是应该由专业语言措辞人员去对应的,而不是由程序员决定最终的版本。比如我代码里写一个errorcode:992,“没输密码!”,就会被专业措辞人员修饰为"请输入用户名,然后重试!" 解决的方法 也有多种,各有其优点和不足之处,写在这里供大家参考: 1.最古老的做法,是把信息写入一个文本文件里面: // xxxxxxxxxx 一些注释 xxxxxxxxxxx // xxxxxxxxxx 一些注释 xxxxxxxxxxx // xxxxx Error Code : 998 // xxxxx Msg : "请输入用户名,然后重试!" // xxxxx 描述: ... #define Error_998_MSG "请输入用户名,然后重试!" // xxxxxxxxxx 一些注释 xxxxxxxxxxx // xxxxxxxxxx 一些注释 xxxxxxxxxxx // xxxxx Error Code : 999 // xxxxx Msg : "xxxxxxxxx, xxxxxxxxxxxxxxx!" // xxxxx 描述: ... #define Error_999_MSG "xxxxxxxxxxxxxxxx!" 诸如此类的做法,当系统启动的时候把这些资源读入内存中 优点:已经基本上解决了上述所说的弊病; 缺点:跨平台交互不容易,尤其是文件内码不同的情况,比如utf-8环境、ansi char环境、unicode环境........... 2. 写入xml文件里面:(推荐) 这种做法和上述方法类似,不过解决了上述方法的缺点。常用于Web相关的开发。 优点:标记语言,交互方便。扩展方便,功能强大且无限制。 缺点:编写人员必须熟悉xml语法,或者有专用的用于简化生成这个xml文件的程序。 3. 写入数据库里面: 应用这种方法的也很多,我就遇到若干这种做法的项目。形象一点的说,你可以参考Sql Server中的错误信息,它也是写在一个系统表里面。 优点:利用SQL的优势,编写、修改都很方便,程序员、翻译、维护人员和用户都很轻松。客户甚至可以自己修改MSG信息。 缺点:一般这种做法只用于数据库相关的应用,比如MIS系统。另外,如果出现数据库根本连接不上的错误,这种错误信息还要当作特例解决。 另外,交互-速度较慢。 今天在论坛上偶见此问题,遂废话一堆,抛砖引玉,希望大家批评指正。 -------------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值