function 函数名 (形式参数列表) { //函数逻辑实现 return 返回值; }
const sum = function (形参列表) { //函数逻辑实现 return 返回值; };
function dis() { console.log('hi'); } console.log(dis());//undefined
function dis(age = 18) { return age }
function dis(num1, num2) { return num1 + num2;//有返回值 } console.log(dis(1, 2));//3
const sum = (num1, num2) => { return num1 + num2; };
const sum = (num1, num2) => num1 + num2;
const sum = (num1, num2) => { let res = num1 + num2 return res; };
let double = num1 => num1 * 2;
let sum = () => console.log('hello, world');
btn.addEventListener('click', () => { console.log(this);//window }) btn.addEventListener('click', function () { console.log(this);//具体的事件对象,如按钮 button })
;(function() { // 函数体 })();
;(()=> { // 函数体 })();
; (async () => { let res = await fetch('https://glpla.github.io/utils/data/coffee.json') let data = await res.json() console.log(data) })();
function fn(n) { // if (n == 0) { // return 1; // } else { // return n * fn(n - 1); // } return n == 0 ? 1 : n * fn(n - 1); }
function fn(n) { if (n == 0 || n == 1) { return 1; } else { return fn(n - 1) + fn(n - 2); } }
Array.prototype.flat = function () { let flatArr = [] for (let item of this) { if (Array.isArray(item)) { flatArr = flatArr.concat(item.flatArr()) } else { flatArr.push(item) } } return flatArr; }
.相同的输入始终得到相同的输出
.大多数的操作都是以数组为对象,所以后续各例都以数组为例
.如果一个函数的执行会修改到数组,则这个函数不是纯函数
.如果一个函数没有参数,那它就不是纯函数
.不会修改外部环境,如全局变量
function cb(fn, para) { return fn(para); } function add(num) { return num + 10; } let res = cb(add, 10); console.log(res);
. 利用创建私有变量来保护数据、隐藏数据;外部无法直接访问,只能通过内部函数访问
. 尽量少使用全局变量;避免全局变量污染环境
. 通常使用return把内部变量/临时变量,如instance,暴露出去给外部使用
const singleton = (function () { let instance; return function () { if (!instance) //创建instance return instance } })()
let a; function fa() { let tmp = 10; return function res() { return tmp; } } a = fa(); console.log(a());
function fb() { let a = 10; return function res(inc) { a += inc; return a; } } let b = fb(); console.log(b(2)); console.log(b(2));
let fn; function assign() { let tmp = 12; fn = function () { return tmp; } } assign(); console.log(fn());
let num = 0; function fn() { num++; console.log('fn() done ', num); return num; }
fn() fn() done 1 1 fn() fn() done 2 2 fn() fn() done 3 3 fn() fn() done 4 4 num=100 100 fn() fn() done 101 101
function fn() { let num = 0; return function () { num++; console.log('fn() done ', num); } } let a = fn();
a() fn() done 1 undefined a() fn() done 2 undefined num=100 100 a() fn() done 3 undefined a() fn() done 4 undefined
function sum(num0, num1) { return num0 + num1; }
function sum() { let res = 0; for (let i = 0; i < arguments.length; i++) { res += arguments[i]; } return res; } sum(1, 2); sum(1, 2, 3);
function fn(a, b) { console.log(fn.length);//2 - 形参个数为2 console.log(arguments.length)//4 - 实际传入4个参数 } fn(1, 2, 3, 4)