闭包与this

本文深入探讨JavaScript中的闭包现象,解释其原理及作用,包括作为返回值和参数时的行为。同时,介绍了`call()`、`apply()`和`bind()`方法在改变`this`指向上的差异。此外,举例展示了如何利用闭包实现数据私有化,并提供了一个手写`bind`的方法实现。最后,通过`creatCache`函数展示了闭包在创建缓存对象中的应用。
摘要由CSDN通过智能技术生成

闭包

  1. 作为返回值,在程序中返回的函数,由外面的变量引用了,所以不会销毁,从而形成了闭包,help得到的是一个函数,当函数执行的时候,函数会去找执行上下文中的a,即函数app中的a

    function app() {
            let a = 10010;
            return function () {
                console.log(a);
            }
        }
    
        const help = app();
        let a = 10086;
        help();
    
  2. 函数作为参数,当函数作为参数传递的时候,传进去的是整个app,app执行的时候会找自己的执行上下文,于是就找到了a = 10086,如果app中没有a变量,那么就会去全局作用域中找,并不会在printf中找

    function printf(fn) {
            let a = 10010
            fn()
        }
    
        let a = 10000
    
        function app() {
            let a = 10086
            console.log(a);
        }
    
        printf(app);
    

this的指向是根据执行上下文来决定的,call,band,apply可以改变this的指向

​ call() 和 apply() 之间的区别

​ 不同之处是:

​ call() 方法分别接受参数。

​ apply() 方法接受数组形式的参数

​ band() 方法除了返回是函数以外,它 的参数和 call 一样。

​ 详情请参考:https://www.runoob.com/w3cnote/js-call-apply-bind.html

function fn1() {
        // 这里的this是指window
        console.log(this);
    }

    // 这里通过call改变了this的指向,指向了{a:100}这个对象
    function fn2() {
        fn1.call({a:100});
    }

    // 这里通过bind改变了this的指向,不过与call不同的是,bind会返回一个新的对象,需要新的变量去接收
    let bind = fn1.bind({a:200})
    // 这里可以证明fn1是window对象点出来的,所以指向window没毛病
    console.log(window.fn1 === fn1)
    fn1()
    fn2()
    bind()
// 这里使用let关键字声明的对象并不在全局上
    let o = {
        user:"peter",
        fn:function(){
            console.log(this.user); //peter
        }
    }
    o.fn();

手写bind方法

Function.prototype.bind1 = function () {
        // 将参数解析为数组
        const args = Array.prototype.slice.call(arguments);
        // 获取this(去除数组第一项,数组剩余的就是传递的参数)
        const t = args.shift();
        // 谁调用,this就指向谁
        const self = this;
        // 返回一个函数
        return function () {
            // 执行原函数,并返回结果
            return self.apply(t, args);
        }
    }

闭包的使用场景(将数据私有化)

function creatCache(){
        let data = {}
        return {
            set(key, val) {
                data[key] = val;
            },
            get(key) {
                return data[key];
            }
        }
    }

    let app = creatCache();
    app.set('a',100);
    console.log(app.get('a'));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值