函数基础

论坛 期权论坛 期权     
游途中   2019-6-7 07:05   970   0
[h1]一、函数是什么?[/h1]函数就一个代码块,可以是一个完全独立与其它内容没有关系的代码块,也可以是一个与外界环境紧密相关的代码块。函数是一个拥有输入和输出的独立代码块。函数是程序中最重要的组成部分。
函数,是一种封装(将一些语句,封装到函数里面)。通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。
在javascript里,函数即对象,程序可以随意操控它们。函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量,它给javascript带来了非常强劲的编程能力。
函数的功能、好处:
1) 将会被大量重复的语句写在函数里面,这样以后需要这些语句的时候,直接调用函数,不用重写那些语句。
2) 简化编程,让编程变的模块化。
[h1]二、函数的声明[/h1]函数有三种声明的方法,而且有各自不同的特点。
[h2]1、普通函数声明[/h2]函数关键字 + 函数名 + (){
语句
函数体}   
例如:

  1. function functionName(){
复制代码
  1.     alert("程序员的摇篮");
复制代码
  1.    // ...语句//
复制代码
  1. }
复制代码
注:1.函数命名跟变量一样,只能是字母、数字、下划线、美元符号,不能以数字开头。
2. 后边()里放参数用的
函数名的规范:
1、普通的函数使用,名称需要驼峰式命名法,即函数是多个词组构成时,第一个单词的首字母小写,其余的单词首字母大写。函数名不能与关键词和保留字重复,不能与变量名重复。
2、类的构造函数,是驼峰式命名,但是第一个单词首字母需要大写。
[h2]2、匿名函数声明[/h2] var  变量名称 = function (){
      函数内容
}
  1. var funName=function () {
复制代码
  1.     //函数内容
复制代码
  1. };
复制代码
定义一个匿名函数,所谓匿名函数就是没有函数名。但是匿名函数定义后如果不保存在一个变量中,就找不到了,因此,我们通常会用一个变量接收这个匿名函数。
匿名函数尾部结束时需要用;来结束,普通的函数结束后不用;结束的。
  1. var funName=function abc() {
复制代码
  1.     //函数内容
复制代码
  1.     console.log(abc);
复制代码
  1. }
复制代码
匿名函数也是可以定义函数名称的,只不过比的地方不能使用,只能在函数内部使用。

[h2]3、Function构造函数声明[/h2]使用Function构造函数
  1. var box=new Function('num1','num2','retun num1+num2');
复制代码
  1. //num1,num2参数
复制代码
num1,num2参数, 最后的字符串是函数体
注意:第三种方式我们不推荐,因为这种语法会导致解析两次代码(第一次解析常规JS代码,第二次是解析传入构造函数中的字符串),从而影响性能,但我们可以通过这种语法来理解函数是对象,函数名是指针的概念。

[h1]三、函数的存储[/h1]JavaScript程序是一种解释性语言。那么什么时候解释性语言呢。
计算机其实并不认识程序,不管是什么代码计算机都不认识,因为计算机只是机器,如果我们需要让计算机认识程序,那么就需要一个翻译,就是把程序代码变成计算机可以理解的语言:0和1的信息序列。目前存在两种翻译类型:一个是编译,一个是解释。两种方式都需要对代码进行翻译,只是翻译的时间不同而已。
编译型语言在计算机运行代码前,先把代码翻译成计算机可以理解的文件,这种文件计算机就能看懂了,但是不管是程序员还是其他人员都看不懂的。并且这种代码,计算机可以执行了,但是每次我们需要修改代码时都需要修改源代码,然后再进行编译新的文件才可以使用,也就是不能再编译好的文件上修改。这种代码的优势是运行速度快,在执行前就知道代码是否错误,因为编译时就做了判断。
解释型语言则不同,解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。这样解释型语言每执行一次就要翻译一次,效率比较低。而且执行时才知道代码是否错误。
而JavaScript就是解释性语言。但是注意程序在运行的时候,解释器首先会收集所有的普通定义的函数,并且把他们存储在堆里,这时候才从头开始执行代码。
  1. abc();
复制代码
  1. function abc() {
复制代码
  1.    
复制代码
  1. }
复制代码
例如我们看到这里abc的执行在函数的上面,如果按照代码的执行顺序,应该先执行abc,再创造函数,那么显然就会报错。但是这样不会有问题。就是说明,函数首先会被收集在堆里,不管在哪里调用,都是调用堆里的函数,因此普通定义的函数执行时可以写在前面或者写在后面。
但是注意如果我们使用匿名函数这种情况就不同了。虽然我们会收集匿名函数在堆里,但是如果找到它时,我们就需要在把它赋给一个变量以后才可以执行,否则就会报错。
  1. abc();
复制代码
  1. var abc=function () {
复制代码
  1.    
复制代码
  1. }
复制代码
  1. //这是错误的。
复制代码
例如上面这种就是错误的。
[h1]四、函数的参数[/h1]参数是指由外部传入到函数中的变量,仅作为变量使用,但是该变量可以是任何内容,包括函数。
被传入的参数作为局部变量使用,可以被覆盖掉。
参数就是一个局部变量,通过外界传入值,这个参数就是对应的值。参数是按照顺序填入的。参数在JavaScript中不要求写入参数的类型和默认值,如果需要默认值,就需要在函数中,根据条件判断增加默认的值。有时候我们可以不用定义参数,直接在函数调用时,带入参数,也可以获取到。(不建议大家使用)
为什么要从外部带入参数。一般来说函数是独立处理某段代码的集合,如果,这段代码需要重复执行,就会设计出函数,在不同的地方调用,达到代码共用的目的,减少代码量。但是在某些时候,虽然是同样的代码,但是我们需要它发挥出的作用更大,可以解决不同的问题,这时候,传入的参数就可以起到代码干预作用,在同一个函数中解决了很多不同的问题。这时候设计函数的独立性就显得非常重要了。当然,任何事情解决都不是绝对的,过度设计复杂的函数有时候反到会让代码效率降低。
同时,外部传入的参数可以节省全局变量的定义,甚至保证函数中的部分变量的独立性。
参数分为实参和形参。
实参:真实的数值、字符串
形参:一个接收实参的变量
例如这里是通过一个函数中的参数来控制在页面上添加多少个li
  1. var m=5;
复制代码
  1. createUl(m);
复制代码
  1. function createUl(n) {
复制代码
[code]    if(n
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP