function
关键字;/* 基本语法 */
function 函数名(参数) { 函数体 }
function
声明创建一个函数,基本语法如上所示;函数名(相应参数)
进行调用。function isPrime(n) {
for (let i = 2; i < n / 2; i++) {
if ( n % i == 0) return false;
}
return true;
}
isPrime(11)
isPrime(111)
return needed
返回需要的数据;return ;
返回空,空也是一个数据,null
/undefined
,严格来说是未定义undefined
;function one() { return 1; }
function nothing() { return ; } // 亦或是 function nothing() { }
one() === 1 // true
nothing() == null // true
nothing() === undefined // true 严格等于
myButton.onclick = function () { alert('Push'); } // myButton 需先建立
function
引导的函数表达式(同时也就是匿名函数);/* 下面三种函数的创建是等效的 */
function f() { return 1; }
let f = function () { return 1; }
lst f = () => { return 1; }
f() // 1
let g = f;
/* 函数作为参数 */
function showYourFunc(n, fn) {
if (fn !== undefined) alert(fn);
else alert(n)
}
showYourFunc(111, ) // 弹窗显示111
showYourFunc(111, function() { /* 这是一个回调,但是没有内容只有注释 */ }) // 弹窗显示回调函数
一个创建函数的更加简洁的方式,基本语法如下:
表达式可执行,所以是一个语句;
语句有值(undefined
),所以也是一个表达式。
/* 函数体只有一个语句 */
() => 单个语句
单个参数 => 单个语句
(单个参数) => 单个语句
(参数1, 参数2) => 单个语句
/* 函数体有多个语句,使用{} */
() => { 多个语句 }
单个参数 => { 多个语句 }
(单个参数) => { 多个语句 }
(参数1, 参数2) => { 多个语句 }
function
的引导,关键部分是箭头 =>
,这是一个复合符号,中间不能有空格;()
可以省略;()
不能省略;{}
可以省略;{}
不能省略;this
指向外层的对象;let f1 = () => alert('这是一个箭头函数');
let f2 = n => n * 2;
let f3 = (n) => n * 2;
let f4 = (...[a, b, c]) => a + b + c // 解构: ...[a, b, c] == a, b, c
f1() === undefined // true
f2(5) == 10 // = f3(5)
f4(1, 2, 3)
let g1 = () => { alert('111'); console.log('111'); }
let g2 = n => { if (n <= 2) return 1; else return g2(n-1) + g2(n-2); } // 斐波那契数列
let g3 = (n) => { if (n <= 2) return 1; else return g2(n-1) + g2(n-2); }// 斐波那契数列
let g4 = (a, b) => {
if (a == b) return a;
else if (a < b) return g4(a, b - a);
else return g4(a - b, b) // 辗转相除法
} // 求最大公约数
g1() === undefined // true
g2(4) == 3 // = g3(4)
g4(121, 11) // 11
可先调用,再声明
,但不能重复声明,可以赋值给其他变量;parameter
,在调用时,argument
;function calc(a, b, operator) {
const ops = ['+', '-', '*', '/', '**', '%']
if (ops.includes(operator)) {
return eval(`${a}${operator}${b}`);
}
return a + b;
}
function name(parameter1=默认值1, parameter2=默认值2) { 函数体 }
undefined
。/* 旧 JS 的手段 */
function f(p) {
if (p === undefined) p = 1; // 以下两种亦可以
// p = p || 1
// p = p ?? 1
}
/* 新 JS 的手段 */
function f(p = 1) {
}
...restParameter
,放在参数列表的最后一个;...
起解构作用的优先级高,所以 ...[c, d]
会被解构成 c, d
,这样就失去意义了。function f(a, b, ...restParameter) { // restParameter只是一个名字,也可以叫其他的
let s = 0;
for (const rp of restParameter) {
s += rp;
}
return a + b + s;
}
f(1, 2) // 3
f(1, 2, 3) // 6
f(1, 2, 3, 4) // 10
function g(a, b, ...[c, d]) { // 等效于 function g(a, b, c, d)
return a + b + c + d;
}
/* 简单的解构赋值 */
let [a, b] = [1, 2] // a==1 b==2
/* 挑选的解构赋值 */
let [a, b] = [1, 2, 3] // a==1 b==2 挑取前两个
let [a, , b] = [1, 2, 3] // a==1 b==3 挑第一、三个
/* 有默认值的解构赋值 */
let [a=1, b] = [, 2, 3] // a==1 b==2 a有默认值
let [a=1, b] = [null, 2, 3] // a==1 b==2 a有默认值
let [a=1, b] = [undefined,2]// a==1 b==2 a有默认值
/* 带有剩余的解构赋值 */
let [a, b, ...rest] = [1, 2, 3, 4, 5] // rest=[3, 4, 5]
let [a, ,b, ...rest] = [1, 2, 3, 4, 5] // rest=[4, 5]
/* 带有参数解构的解构赋值:...[c, d]先被解构成 c,d */
let [a, b, ...[c, d]] = [1, 2, 3, 4, 5] // c==3, d==4
let [a, ,b, ...[c, d]] = [1, 2, 3, 4, 5]// c==4, d==5
/* 一般对象的解构赋值(数组是一个特别的对象) */
let {a, b} = { a: 1, b: 2 } // a==1, b==2, 名字相同则取值,否则undefined
let {a1, b1} = { a: 1, b: 2 } // a1==b1==undefined
- 内部变量:块内部的变量,像函数等一些块的内部变量,只能作用在块内;
- 外部变量:不被块限制的变量,常常是全局变量,也可以是从其他地方导入的变量,一般可以在块内部被操作,如循环体、函数体等都可以对外部变量进行操作。
/**
* 返回 x 的 n 次幂的值。
*
* @param {number} x 要改变的值。
* @param {number} n 幂数,必须是一个自然数。
* @return {number} x 的 n 次幂的值。
*/
function pow(x, n) {
...
}