鍍金池/ 問答/HTML/ 如何理解匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其this對象通常指向window這句

如何理解匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其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啊
該如何理解這個輸出值和這句話呢?

回答
編輯回答
寫榮

《JavaScript高級程序設計(第三版)》第73頁《4.2 執(zhí)行環(huán)境及作用域》

附贈一堆用例

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
2017年1月11日 10:29
編輯回答
櫻花霓

1.object.getNameFunc()()最后可以寫成function function(){ return this.name;}()
2.因為是全局調(diào)用的匿名函數(shù)所以this指向的是window
3.function(){ return this.name;}()作為閉包他有權訪問上級作用域中的變量如果如第二段代碼所寫把object對象存入that中,那么我們就可以訪問到object.name

2018年6月5日 15:18
編輯回答
抱緊我

在看到其他問題的時候看到了這個例子的解釋:
object.getNameFunc()返回一個匿名函數(shù),在全局環(huán)境調(diào)用該函數(shù),this指向的全局對象
也就是說返回的是匿名函數(shù) 而這個匿名函數(shù)是在全局執(zhí)行的因此this是指向window的

而匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其this對象通常指向window這句話
是因為閉包返回的匿名函數(shù)是在全局環(huán)境中執(zhí)行的因此this指向window

這是我的理解 希望可以對關注這個問題的人有所幫助

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

2018年6月5日 07:40
編輯回答
薄荷綠

建議樓主有時間看一下 你不知道javasrcipt 上卷,這本書對this的指向做了詳細的講解,個人認為比我所看過的同類書籍分析的到位,this的四種指向

2018年4月25日 03:31
編輯回答
冷咖啡

沒那么復雜object.getNameFunc()()拆開看

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

然后調(diào)用這個函數(shù).

object.getNameFunc()() 補上后面那個括號之后相當于 
function(){
        return this.name;
      }()

這個是全局調(diào)用,返回widow里面的
第二個不用說了。直接保存了this,不會變了

2018年7月24日 11:42
編輯回答
執(zhí)念

閉包返回的是一個匿名函數(shù)
所以調(diào)用閉包后得到的是一個匿名函數(shù)
而你在全局里去調(diào)用閉包再去執(zhí)行就是在全局獲得一個匿名函數(shù)去執(zhí)行
因此匿名函數(shù)的執(zhí)行時具有全局性的
在全局執(zhí)行匿名函數(shù) 則匿名函數(shù)的this指向全局

2018年5月19日 11:20