1.以下代码的输出结果?是否产生了闭包?
var name = 'The Window';
var object = {
name: 'My Object',
getNameFunc: function() {
return function() {
return this.name;
};
}
};
console.log(object.getNameFunc()());//The Window
输出的是 The Window
原因:
如果var f = object.getNameFunc()就等价于:
var f = function() {
return this.name;
}
那f()就等价于object.getNameFunc()()
而f()也等价于 function() { return this.name;}()
这个f()就是一个立即执行函数,立即执行函数的this指向window
每个函数再调用时都会自动创建两个特殊变量:this 和 arguments ,内部函数不可能直接访问外部函数的这两个变量。
没有访问到局部变量就没有闭包的产生。
2. 以下代码的输出结果?是否产生了闭包?
var name = 'The Window';
var object = {
name: 'My Object',
getNameFunc: function() {
var that = this;
return function() {
return that.name;
};
}
};
console.log(object.getNameFunc()()); //My Object
输出是 My Object
原因:如果var f = object.getNameFunc()
即 f = function() {return that.name};
这个that保存的是object里面的this,object里面的this指向的是object
所以object.getNameFunc()(),即就是 f(),的结果就是 My Object。
返回的匿名函数访问了其作用域之外的局部变量,所以产生了闭包。