素材牛VIP会员
如何理解匿名函数的执行环境具有全局性,因此其this对象通常指向window这句话?
 lo***ou  分类:Node.js  人气:1308  回帖:4  发布于6年前 收藏

高程书地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啊
该如何理解这个输出值和这句话呢?

 标签:node.jsjavascript

讨论这个帖子(4)垃圾回帖将一律封号处理……

Lv4 码徒
鬼***0 JAVA开发工程师 6年前#1

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

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

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

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

Lv4 码徒
ji***ca JS工程师 6年前#2

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

Lv4 码徒
Ro***ng Linux系统工程师 6年前#3

《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
Lv2 入门
he***ba JS工程师 6年前#4

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

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

然后调用这个函数.

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

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取