Functions
Example
function square(number) {
return number * number;
}原始参数(例如数字)以值的形式传递给函数;该值会传递给函数,但如果函数更改了参数的值,则此更改不会反映到全局或调用函数中。如果将对象(即非原始值,例如数组或用户定义对象)作为参数传递,并且函数更改了该对象的属性,则该更改在函数外部可见
function myFunc(theObject) {
theObject.make = 'Toyota';
}
let myCar = { // myCar is a JS object
make: 'Honda',
model: 'Accord',
year: 1998
};
let x, y;
x = myCar.make; // x gets the value "Honda"
myFunc(myCar);
y = myCar.make; // y gets the value "Toyota"
// (the make property was changed by the function)
console.log(x, y);Function expressions
虽然上面的函数声明在语法上是一个语句,但函数也可以通过函数表达式来创建。这样的函数可以是匿名的;它不必有名称
let square = function(number) { return number * number; };
let x = square(4); // x gets the value 16
console.log(x);或作为常数
const square = function(x) {
return x * x;
};
console.log(square(12)); // 144Arrow functions
- 是 JavaScript 定义函数的一种简洁写法。
- 用
=>(箭头)代替传统的function关键字。 - 更短、更方便,尤其在回调函数和数组操作中很常用。
Example
More Example
Optional Arguments
假设有以下功能
有一种方法可以为参数提供默认值,如下面的代码所示:
- 用
exponent = 2自动赋默认值,没传参数 → 当成2计算
Closures 闭包
闭包是 JavaScript 的一个重要且基本的特性,但现在有点高级。当它对于理解我们正在使用的代码变得重要时,我们将进一步讨论它。JavaScript 允许函数嵌套,并授予内部函数对外部函数内定义的所有变量和函数(以及外部函数可以访问的所有其他变量和函数)的完全访问权限。但是,外部函数无权访问内部函数内定义的变量和函数。这为内部函数的变量提供了一种封装。此外,由于内部函数可以访问外部函数的作用域,如果内部函数的存活时间超出外部函数的生命周期,那么外部函数中定义的变量和函数的存活时间将比内部函数执行的时间更长。当内部函数以某种方式对外部函数外部的任何作用域可用时,就会创建闭包。
- 闭包(Closure) = 函数 + 其外部作用域的变量的引用
- 在 JavaScript 里,内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。
- 这样,外部函数里的变量可以被“封装”起来,只能通过内部函数访问,外部代码直接访问不到。
闭包在这里的作用
- 封装数据:
name和age对外不可见,防止被随意修改。 - 数据持久化:即使
createClient执行完毕,它内部的name和age依然保存在内存里,因为client对象的方法还在引用它们。 - 控制访问:只能通过
get.../set...方法访问和修改变量,可以加上逻辑判断(比如setAge限制 0–100)。