请教一个闭包的问题,

伏地猫 发布于 2012/08/05 22:30
阅读 1K+
收藏 3
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
     };
    }
};
alert(object.getNameFunc()()); //The Window
为什么是The Window 呢 我知道是闭包,但是过程不太清楚,麻烦讲的详细一点,谢谢。。
加载中
0
hell0cat
hell0cat

小伙子,据我所知,你的包没闭上,所以this指向最外层对象,javascript的最外层对象就是window,所有全局变量,如name自动追加到window对象上,所以访问的是全局的name,

这样就闭上了:

var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : (function(){
      return function(){
        return this.name;
     };
    })()
};
alert(object.getNameFunc()); //My Object

0
th小米粥
th小米粥

this.name 是指   getNameFunc : (function(){  这个函数里边的name

你可以直接取 object.name试试..

0
水牛叔叔
水牛叔叔

把this放到一个function里,this的所指的范围就变了(详细的去百度一下)

var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(name){
      return function(){
        return name;
       };
    }(this.name)
};
alert(object.getNameFunc());

0
maxid
maxid

这样直接return一个function,使得该function与object处于同一个scope中,当然是返回This Window了,而从object.getNameFunc()()调用方式就可以看出来了,实际上变成了

var name = "This Window";
alert(function(){
    return this.name;
}());

正确写法应该是如一楼那样或如下:

  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return this.name;
    }
  };
  alert(object.getNameFunc()); //My Object


伏地猫
伏地猫
看了你的,有点明白了
0
卢温禾
卢温禾
var name = 'The Window';
var object = {
	name: 'My Object',
	getNameFunc: (function() {
		var me = this      
		return function() {        
			return me.name;     
		};    
	})
};
alert(object.getNameFunc()());

0
hylent
hylent
new object().getName() ????
0
Arrowing
Arrowing

你这个题目是在javascript高级程序设计第三版里面的呀 = =,这书我在看呢

书里的解释是:每次函数在被调用时,其活动对象都会自动取得this和arguments。内部函数在搜索这2个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这2个变量。。。
0
Arrowing
Arrowing

因为搜索不到外部函数的this,那么内部的函数的this自然就指向window了

在这里,this和arguments的引用原理是一样的

一般这样子想访问外部函数的this,可以用一个变量保存外部函数this的值

var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        var obj_this = this;
        return function(){
            return obj_this.name;
        };
    }
};
alert(object.getNameFunc()()); //My Object

伏地猫
伏地猫
在网上看到的,不过你写的也蛮好。
0
Arrowing
Arrowing

@杰西客

闭包简单来说,不就是函数里面的函数么?何来闭不闭之说?

你这样写的代码,实际上会变成:如4楼所言 @maxid

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return this.name;
  }
};
alert(object.getNameFunc()); //My Object

因为你匿名函数执行时,return的函数还没执行,故this还未初始化

return的函数执行时,其作用域链上的this指向object

返回顶部
顶部