js-闭包(函数)
创始人
2025-05-28 05:22:25

尾调优化 函数柯里化 防抖 节流

局部作用域,全局,块级,其中局部又叫函数作用域;

函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。闭包利用的就是函数的作用域原理

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); //

2. 函数才有return, 终止函数(放在for循环,可以终止循环)

3. 变量和函数提升, 函数同名后面覆盖前面的

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
  1. 等号设置默认值
function fuc(para=123) {return para
}
fuc(456) /// 不传的话,就是默认值123

5.匿名函数写成箭头函数

5.1.var f = v => v

var f = function(v) {return v;
}返回对象要加()
简化回调函数[1,2,3].map(x => x*x) 
  1. 概念
    作用域: 内层可以访问外层,外层不能访问内层.
    闭包: 即能够读取其他函数内部变量的函数。

立即执行函数

没有命名函数, 避免污染全局变量; 1. 封装私有属性和私有方法.2.一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。

  function getNumber() {var n = 999;return function getN(){console.log(n++)}}var f = getNumber();f(); //999f(); //1000
  1. 应用场景

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)

相关内容

热门资讯

最新或2023(历届)贵州省养... 最新或2023(历届)再有二个月就结束了,新的一年即将来临。每次在新年开始之际,都要给企退人员调整养...
最新或2023(历届)贵阳市养... 最新或2023(历届)再有二个月就结束了,新的一年即将来临。每次在新年开始之际,都要给企退人员调整养...
最新或2023(历届)六盘水市... 最新或2023(历届)再有二个月就结束了,新的一年即将来临。每次在新年开始之际,都要给企退人员调整养...
二胎是否可以享受生育保险? 二...   二胎可以享受生育保险吗?   参保单位为职工缴纳了生育保险,且参保人员符合二胎生育政策的便可享受...
兰州被征地完全失地农民养老保险... 兰州被征地完全失地农民养老保险政府承担60%  最新或2023(历届)10月16日,记者从兰州市人社...