通过将大段的代码重构(refactor)为一系列函数,可以在不改变代码功能的情况下,重新组织代码,使其更易于理解和维护
用函数封装代码块,每个函数只做一件事,并把这件事做好,可重用性更高
在函数内部声明的变量是局部变量,在函数外声明的变量是全局变量
全局变量的寿命:与网页一样长(重新加载网页,将销毁并重新创建所有全局变量)
局部变量的寿命:与使用该局部变量的函数一样长(局部变量在函数结束后消失)
函数内的局部变量与全局变量同名,局部变量遮住(Shadow)全局变量
函数内如果没有与全局变量同名,则可以在函数内修改该全部变量
注意,同一网页中的多个JavaScript文件只有一个全局作用域(每个JavaScript文件创建的全局变量都位于同一空间内),全局变量是互通的,这可能导致难以跟踪全局变量的使用位置,进而导致bug
JavaScript对代码结构要求不严,无需规划就可直接编写代码
这也许是好事,但对于需要长期维护和修改的重要代码,这样做的缺点就暴露出来了
因此,常有人抱怨JavaScript过度使用全局变量
因此,对于复杂的需要长期维护的代码,不要大量创建全局变量,而是尽可能地使用局部变量
自定义一个函数
function 函数名( 形参(可能没有)){
函数体
return 返回值;
}
调用函数时,先计算上面括号内的表达式的值(字符串/数字/true/false等),再将结果作为传递给函数的值,称为实参
向函数传递参数
JavaScript按值传递实参(pass-by-value),把每个实参的值复制给形参,即向函数传递了实参的副本
在函数进行处理时,只会影响形参,不会影响实参
也就是说在函数中处理形参时,其影响范围仅限于函数内部
形参可以视为局部变量
注意:也有例外——实参为对象变量的情况
基本类型的变量(数字、字符串等)存储的是实际值
对象变量存储的是指向对象的引用,而非对象本身
实参为基本类型变量,则传入[变量]的副本,函数中的操作不改变原始变量
实参为对象变量,传入[指向该对象的引用]的副本,函数直接修改原始对象
形参(局部变量)与实参同名,结果如何?
函数执行时,形参x
(局部变量)将遮住实参x
(实参可能为全局变量,也可能是另一函数的局部变量)
两个x
互不影响
function addOne(x){
x=x+1;
}
var x=1;
addOne(x);//执行完毕后,x的值仍为1
传入的实参不够,结果如何?
没有传入的实参,其对应的形参将被设置为undefined
,函数正常运行
传入的实参过多,结果如何?
JavaScript将忽略多余的实参
没有“形参”的函数?
很多函数没有形参
例如Math.random()
的括号中不需要填入任何实参,但它也是函数
这关联到对象的概念
没有“return”的函数?
没有return
语句的函数返回undefined