首页 > 代码库 > 第二章-函数

第二章-函数

1 函数的定义和调用

  基本格式

function 函数名(参数列表){    函数体}

 

  函数体中的return一旦执行, 函数就不在执行而是返回了

  如果没有return, 则函数执行完毕就结束, 返回的值是undefined

  第二种函数定义

var 函数名 = function (参数列表){    函数体  };

  注意最后严谨一点加上分号表示赋值语句结束, 整个句子表示将函数赋值给一个变量, 该变量(参数列表) 就可以执行函数了

  调用函数

    函数名(参数列表);

    函数赋值的变量(参数列表);

  JavaScript有个十分随意的设定, 传入的参数是, 可以传入多余需要的参数, js会按照顺序得到需要的参数, 剩余的参数不管, 不会报错, 同理少传入参数也没有关系, 缺少的参数会设置为undefined

  在函数内部, 有个特殊变量arguments

  该变量存储传入进来的所有参数, 可以用类似于数组的方式获得数据

  技术分享

  配合arguments使用的是rest, 它可以排除函数定义的参数列表的参数

   技术分享

    当传入的参数少于参数列表的参数, rest得到的是一个空数组, 而不是undefined

  特殊注意:

    JavaScript尽管可以不加分号, 但是它实际上会在一行的末尾自动添加上分号

    这点就可能造成一下误会, 比如return与后面的返回值写成了两行, 那么其实际情况会是return; 返回语句;这样就出意外了

    技术分享

2 变量作用域

  在函数内定义的变量的作用域只是函数, 函数外面无法引用到函数内部定义的变量

  函数可以嵌套, 内部函数可以使用外部函数的变量, 但反过来不行

  变量的查找也是从内向外查找的

  特殊注意:变量提升

    JavaScript在函数中有一个十分诡异的操作

    它会先过一遍函数体, 然后把所有变量声明提到函数体首部

    技术分享

  因此在函数中, 一定要养成先定义变量的好习惯

   不在任何函数内定义的变量就具有全局作用域

  事实上, 是将该变量绑定给了特殊对象windows

   技术分享

  因此JavaScript只有一个全局作用域

  为了解决这个问题, 可以使用名字空间

  定义一个全局变量, 这个变量是个对象类型, 以后就往这个对象上添加内容就好了, 这样就会减少重名的情况

  for循环不能形成局部作用域, 要使得for中的变量是局部的, 需要使用关键字let

  let用于代替var声明一个块级作用域的变量

  常量, 名字的所有字母用大写形式表示, 尽管它确实可以被修改, 但是不要修改它

  常量可以用const来定义

3 方法

  绑定给对象的函数叫做方法

  在方法中, 有个特殊的变量this, 这个值始终指向当前对象

  技术分享

  但是如果直接调用计算age的方法, 就会出现预期之外的答案

  技术分享

  原因是, this会视情况而定指向谁, xiaoming.age就是执行的xiaoming, getAge()实际上是windows.getAge()所以指向的是windows

 

  

  

 

第二章-函数