您的位置:首页 > 其它

闭包题目

2017-03-11 10:38 120 查看
<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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  闭包 函数