# IIFE
Immediately Invoked Function Expression, 立即执行函数表达式。
1 2 3 (function ( ) { console .log("IIFE" ); })();
# closure
闭包:外部函数返回后,内部函数仍然可以访问外部函数变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function outer ( ) { let n = 0 ; function inner ( ) { n += 1 ; console .log(n); } return inner; } f = outer(); f(); f(); f();
使用闭包定义私有变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function Product ( ) { let name; this .setName = function (value ) { name = value; }; this .getName = function ( ) { return name; }; } let q = Product();let p = new Product();console .log(typeof q, typeof p); p.setName("orange" ); console .log(p.name, p.getName());
# prototype
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function Rectangle (x, y ) { this ._length = x; this ._breadth = y; } Rectangle.prototype.getDimensions = function ( ) { return { length: this ._length, breadth: this ._breadth, }; }; r1 = new Rectangle(3 , 4 ); r2 = new Rectangle(2 , 2 ); console .log(r1.getDimensions(), r2.getDimensions());
# module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const myModule = (function ( ) { let n = 5 ; function print (x ) { console .log(`The result is ${x} ` ); } function add (a ) { let x = a + n; print(x); } return { description: "This is description" , add: add, }; })(); console .log(myModule.description);myModule.add(5 );
# variable hoisting
1 2 3 4 5 6 7 var y;console .log(y); y = 2 ;
# currying
1 2 3 4 5 const add = (x ) => (y ) => x + y;console .log(add(1 )(2 ));add1 = add(1 ); console .log(add1(2 ));
# apply, call, bind
call, apply 指定 this 值调用函数,apply 第二个参数需要传递数组, bind 为函数绑定 this 值,然后作为一个新的函数返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 const user = { greet: "Hello" , greetUser: function (username ) { console .log(this .greet + " " + username); }, }; const greet1 = { greet: "Hi" , }; user.greetUser.call(greet1, "Babb" ); user.greetUser.apply(greet1, ["Babb" ]); greetHi = user.greetUser.bind(greet1); greetHi("Babb" );
# memoization
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function memoizeFunction (func ) { let cache = {}; return function ( ) { let key = arguments [0 ]; console .log(key); if (cache[key]) { return cache[key]; } else { let val = func.apply(this , arguments ); cache[key] = val; return val; } }; } const fabonacci = memoizeFunction(function (n ) { return n === 0 || n === 1 ? n : fabonacci(n - 1 ) + fabonacci(n - 2 ); }); console .log(fabonacci(3 ));