一、函数参数
(一)形式参数与实际参数
function getSum(a, b) {
return a + b;
}
getSum(10, 20); // 30
在函数定义语句中,定义在参数列表中的 a 和 b 是 getSum 函数的形式参数;调用时传入的则是实际参数,如 10 和 20 就是实际参数。
(二)参数规则
- JavaScript 函数对参数的值不会进行任何的检查,不会关注有多少个参数被传递,也不关注传递的参数的数据类型。
- 在JavaScript中,函数参数的默认值是 undefined。
(三)arguments对象
函数的实际参数会被保存在一个类似数组的 arguments 对象中。在函数内,我们可以通过像数组元素的访问方式来找出传入的参数:arguments[i]
,对于参数的数量,我们可以通过arguments.length 来获取。
二、函数作用域
(一)全局作用域
一个函数是可以访问定义在其范围内的任何变量和函数;定义在全局域中的函数可以访问所有定义在全局域(全局作用域)中的变量。
一般来说以下几种情形拥有全局作用域:
- 最外层函数或者是在最外层函数外面定义的变量拥有全局作用域;
- 所有未通过var关键字定义而直接赋值的变量将自动被声明为全局变量;
- 所有window对象的属性拥有全局作用域。
注意:作用域是分层的,内层作用域可以访问外层作用域的变量,而外层作用域则无法直接访问内层作用域中的变量
(二)局部作用域
函数内定义的变量是不能在函数之外的任何地方访问的,因为这些变量仅仅在该函数的域的内部有效。
(三)作用域链
外层是无法直接访问函数内定义的局部变量的,可以在函数内部再定义一个函数
三、闭包
通过闭包,可以一个内层函数中访问其外层函数的作用域,闭包是由函数以及声明该函数的词法环境组合而成的,且该环境包含了这个闭包创建时作用域内的任何局部变量。
(一)闭包使用场景
常见的两个场景如下:
(1) 读取函数内部的变量;
(2) 让局部变量的值始终保持在内存中。
注意:闭包只会保存被子作用域引用的变量,对于未被使用到的变量仍会被回收
四、this关键字
JavaScript 中的原始对象,一般是以字典(键值对)的结构来保存的,每一个属性名都对应一个属性表述对象
var obj = { foo: 5} // obj保存的是一个地址,通过地址来获取对象,返回foo属性,一般属性的值是保存在该属性表述对象的 value 属性中的。
(一)函数
var obj = { foo: function () {} }; // 先将函数单独保存在内存中,然后将函数的地址值赋值给 foo 属性的 value 属性。
(二)环境变量
使用 this:专门用于函数体内部,用来指代函数当前的运行环境的
var f = function () {
console.log(this.x); // 输出当前运行环境中的x
};
总结:谁调用的函数,函数内部的 this 就指向谁