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