闭包题目

<script>
var x = 20;
var a = {
    x: 15,
    fn: function() {
        var x = 30;
        return function() {
            return x;
        };
    }
}
console.log(a.fn());//function
console.log(a.fn()());//20
console.log((a.fn())());//20
console.log((a.fn())() == a.fn()());//true
console.log(a.fn().call(this));//20
console.log(a.fn().call(a));//15
</script>

这道题的难点就是匿名函数的作用域是全局的,所以比闭包里的this指向的应该是window对象。
而a.fn().call(a)则是将this指向a对象,所以输出的x为a.x。

<script>
var x = 20;
var a = {
    x: 15,
    fn: function() {
        var x = 30;
        //注意!!!!!!
        var that = this;
        return function() {
            return that.x;
        };
    }
}
console.log(a.fn());//function
console.log(a.fn()());//15
console.log((a.fn())());//15
console.log((a.fn())() == a.fn()());//true
console.log(a.fn().call(this));//15
console.log(a.fn().call(a));//15
</script>

这里使用that代替this,那么此时that指向的就是a对象了。console.log(a.fn().call(this));这句我以为是20,但是输出是15.
正确的理解应该是就算传入this指向全局对象,但是返回的匿名函数里的that还是指向a对象。

<script>
var x = 20;
var a = {
    x: 15,
    fn: function() {
        var x = 30;
        return function() {
            return x;
        };
    }
}
console.log(a.fn());//function
console.log(a.fn()());//30
console.log((a.fn())());//30
console.log((a.fn())() == a.fn()());//true
console.log(a.fn().call(this));//30
console.log(a.fn().call(a));//30
</script>

此时匿名函数返回的是x而不是this.x了,所以沿着作用域向上找发现有一个局部变量var x = 30,于是就输出30。

<script>
var x = 20;
var a = {
    x: 15,
    fn: function() {
        return function() {
            return x;
        };
    }
}
console.log(a.fn());//function
console.log(a.fn()());//20
console.log((a.fn())());//20
console.log((a.fn())() == a.fn()());//true
console.log(a.fn().call(this));//20
console.log(a.fn().call(a));//20
</script>

显然,此时匿名函数会沿作用域向上找x,发现只有一个全局的变量x,于是就返回20.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值