如何理解匿名函数的执行环境具有全局性,因此其this对象通常指向window这句话?

高程书地182页有如下两段代码
代码片段一。
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()());
//the Window

代码片段二。
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()());
//My Object

其中对第一段的代码解释就是问题中的那句话
但是既然是object.getNameFunc() 那this不是应该指向object的吗 this.name应该是object.name啊
该如何理解这个输出值和这句话呢?

阅读 4.9k
6 个回答

没那么复杂object.getNameFunc()()拆开看

object.getNameFunc() = function(){
        return this.name;
      };

然后调用这个函数.

object.getNameFunc()() 补上后面那个括号之后相当于 
function(){
        return this.name;
      }()

这个是全局调用,返回widow里面的
第二个不用说了。直接保存了this,不会变了

闭包返回的是一个匿名函数
所以调用闭包后得到的是一个匿名函数
而你在全局里去调用闭包再去执行就是在全局获得一个匿名函数去执行
因此匿名函数的执行时具有全局性的
在全局执行匿名函数 则匿名函数的this指向全局

在看到其他问题的时候看到了这个例子的解释:
object.getNameFunc()返回一个匿名函数,在全局环境调用该函数,this指向的全局对象
也就是说返回的是匿名函数 而这个匿名函数是在全局执行的因此this是指向window的

而匿名函数的执行环境具有全局性,因此其this对象通常指向window这句话
是因为闭包返回的匿名函数是在全局环境中执行的因此this指向window

这是我的理解 希望可以对关注这个问题的人有所帮助

我看的那篇文章是讲bind的 地址如下:
http://www.cnblogs.com/GongQi...

《JavaScript高级程序设计(第三版)》第73页《4.2 执行环境及作用域》

附赠一堆用例

var name = "global";

var foo = {
    name: "foo",
    getName : function(){
        console.log(this.name);
    }
}

var bar = {
    name: "bar",
    getName : function(){
        return (function(){
            console.log(this.name);
        })();
    }
}

foo.getName(); //foo
foo.getName.call(bar); //bar
foo.getName.call(this); //global
foo.getName.call(window); //global
bar.getName(); //global

(function(){

    console.log(this.name)

}.bind(bar))(); //bar

(function(){

    console.log(this.name)

}.bind())(); //global

建议楼主有时间看一下 你不知道javasrcipt 上卷,这本书对this的指向做了详细的讲解,个人认为比我所看过的同类书籍分析的到位,this的四种指向

1.object.getNameFunc()()最后可以写成function function(){ return this.name;}()
2.因为是全局调用的匿名函数所以this指向的是window
3.function(){ return this.name;}()作为闭包他有权访问上级作用域中的变量如果如第二段代码所写把object对象存入that中,那么我们就可以访问到object.name

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏