- 变量的作用域(空间有效范围)。
在js中,只有全局作用域和函数作用域两种。 如果一个变量没有定义在任意函数之内,则为全局作用域。全局作用域是从声明位置开始, 一直到脚本结束。 定义在函数之内的变量,则为函数作用域。函数作用域从声明位置开始,到函数结束。函数 中的变量会覆盖全局的同名变量。函数参数也是属性函数作用域,其作用域从函数开始到函数结束。 在函数中,可以使用全局变量。 - 变量的定义提升。
不管是在全局作用域中,还是在函数作用域中,使用var定义的变量,其定义默认会提升到脚本或 函数的前面。 - 变量的生命周期(时间作用域):
- 全局作用域变量:从执行到定义变量的位置开始,一直到脚本所有代码执行结束。 2. 函数作用域变量:从执行到定义变量的位置开始,一直到函数执行结束(return,要么所有代 码执行结束)。
- 匿名函数及函数表达式
匿名函数:没有名字的函数,如果此函数仅在定义处使用,其它地方不会调用。
在js中,变量,参数,函数的返回值,都可以是函数。 在js中,函数是一等公民。 - 递归调用(选讲)
- 一个函数,直接或间接调用自身。要想函数递归停止,必须在递归函数中设置退出条件。 规律: 1. 任何递归都可以转换为循环来实现,但是有的时候,使用递归更容易理解,更简单方便 。
- 有一些场景使用递归比较方便,使用循环则非常复杂。
- 函数参数的默认值。参数可以使用赋值表达式定义默认值。
- 函数的参数,难以保证是预期的数据类型,所以在函数逻辑之前,根据实际情况,需要对参数 类型进行判定或校验。
参数规则
JavaScript 函数定义显式参数时没有指定数据类型。
JavaScript 函数对隐式参数没有进行类型检测。
JavaScript 函数对隐式参数的个数没有进行检测。
默认参数
ES5 中如果函数在调用时未提供隐式参数,参数会默认设置为: undefined
有时这是可以接受的,但是建议最好为参数设置一个默认值:
<p>设置参数的默认值。</p>
<p id="demo"></p>
<script>
function myFunction(x, y) {
if (y === undefined) {
y = 0;
}
return x * y;
}
document.getElementById("demo").innerHTML = myFunction(4);
</script>
<body>
<p>设置参数的默认值。</p>
<p id="demo1"></p>
<p id="demo2"></p>
<script>
function myFunction(x, y = 10) {
// 如果不传入参数 y ,则其默认值为 10
return x + y;
}
// 输出 2
document.getElementById("demo1").innerHTML = myFunction(0, 2) ;
// 输出 15, y 参数的默认值
document.getElementById("demo2").innerHTML = myFunction(5);
</script>
</body>