尾调优化 函数柯里化 防抖 节流
局部作用域,全局,块级,其中局部又叫函数作用域;
函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。闭包利用的就是函数的作用域原理
function foo() {var x = 1;function bar() {console.log(x);}return bar;
}var x = 2;
var f = foo().toString();eval(f) // undefined
函j数传参的值如果是引用的,改变会变,如果是原始值,则不影响
var obj = [1, 2, 3];function f(o) {o = [2, 3, 4];
}
f(obj);obj // [1, 2, 3]
arguments 这个对象只有在函数体内部,才可以使用。伪数组, 有length, 有索引, 但是不能用数组的方法.
Array.prototype.slice.call(arguments); //
alert(a);//function a(){alert(3);}
var a=1;
alert(a);//1
function a(){alert(2);}
alert(a);//1
var a=3;
alert(a);//3
function a(){alert(3);}
alert(a);//3
function fuc(para=123) {return para
}
fuc(456) /// 不传的话,就是默认值123
5.1.var f = v => v
var f = function(v) {return v;
}返回对象要加()
简化回调函数[1,2,3].map(x => x*x)
立即执行函数
没有命名函数, 避免污染全局变量; 1. 封装私有属性和私有方法.2.一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
function getNumber() {var n = 999;return function getN(){console.log(n++)}}var f = getNumber();f(); //999f(); //1000
2.1 setTimeout()的传参
let a = 123;let foo = function (a) {return function () {console.log(a);}}setTimeout(foo(a), 100)
2.2 封装变量
var counter = (function(){var privateCounter = 0; //私有变量function change(val){privateCounter += val;}return {increment:function(){ //三个闭包共享一个词法环境change(1);},decrement:function(){change(-1);},value:function(){return privateCounter;}};})();
原文链接:https://blog.csdn.net/qq_21132509/java/article/details/80694517
bind实现柯里化(bind的实现机制就是柯里化)
柯里化的优点:参数复用,提前确认和延时运行
function add() {// 第一次执行时,定义一个数组专门用来存储所有的参数var _args = Array.prototype.slice.call(arguments);// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值var _adder = function() {_args.push(...arguments);return _adder;};// 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回_adder.toString = function () {return _args.reduce(function (a, b) {return a + b;});}return _adder;
}var a = add(1)(2)(3) // f 6 ?
var b = add(1, 2, 3)(4) // 10
var c = add(1)(2)(3)(4)(5) // 15
var d = add(2, 6)(1) // 9console.log(a, b, c, d)