鍍金池/ 問答/HTML/ 《Javascript高級(jí)程序設(shè)計(jì)》這本書中關(guān)于this對(duì)象的一段話如何理解?

《Javascript高級(jí)程序設(shè)計(jì)》這本書中關(guān)于this對(duì)象的一段話如何理解?

《Javascript高級(jí)程序設(shè)計(jì)》這本書里提到,每個(gè)函數(shù)在被調(diào)用時(shí)都會(huì)自動(dòng)取得兩個(gè)特殊變量時(shí),只會(huì)搜索到其活動(dòng)對(duì)象為止,因此永遠(yuǎn)不可能直接訪問外部函數(shù)中的這兩個(gè)變量。

所以是不是可以理解為會(huì)一直訪問到全局變量才會(huì)停止呢(沒有綁定的話)?以下是代碼:

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

非常感謝!

回答
編輯回答
遺莣

1.this變量訪問在運(yùn)行時(shí)候才會(huì)被綁定
2.其他變量訪問在定義(位置)時(shí)候被綁定

看這段代碼應(yīng)該可以理解一部分

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
      return this.name;
  }
};
var fun = object.getNameFunc;
console.log(object.getNameFunc())//My Object
console.log(fun())// The Window
2017年12月13日 08:44
編輯回答
久愛她

return function(){}
這個(gè)函數(shù)是全局的

2017年6月18日 00:09
編輯回答
初念

函數(shù)里的this只有被運(yùn)行時(shí)才會(huì)被綁定,而這個(gè)函數(shù)執(zhí)行的時(shí)候是普通方式,所以里面的this永遠(yuǎn)被標(biāo)記為全局對(duì)象,反正一個(gè)函數(shù)或者方法被執(zhí)行的時(shí)候最多就四種,有本書叫你不知道的JS這里面將this我覺得講的還挺不錯(cuò)的,你可以直接翻到那邊看看。
其實(shí)js的this有一定迷惑性,但其實(shí)都逃脫不了那四種情況,安情況對(duì)應(yīng)就好,不然很容易被繞暈

2018年1月7日 18:12
編輯回答
笑浮塵

匿名函數(shù)具有全局性(匿名函數(shù)的this一般指向全局對(duì)象(window,global等)),需要注意的是this只與函數(shù)的執(zhí)行環(huán)境有關(guān),當(dāng)函數(shù)作為某個(gè)對(duì)象的方法來“引用”時(shí),this指向這個(gè)對(duì)象,比如說:

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

var obj2 = {
    name : "obj2"
};
obj2.say = obj.say;
obj2.say();  //輸出obj2
//這里say明明是在obj里面定義的方法,obj2只是對(duì)其進(jìn)行引用,但this最終指向obj2,所以this指向僅僅與函數(shù)的執(zhí)行環(huán)境有關(guān)。

當(dāng)然還有一些比較特殊的,像es6的箭頭函數(shù),卻是與函數(shù)的定義環(huán)境有關(guān),比如說:

var obj = {
    name : "obj",
    say : function(){
        return () => {console.log(this)};
    }
};

var obj2 = {
    name : "obj2"
};

obj2.say = obj.say();
obj2.say(); //輸出obj
//這里箭頭函數(shù)為什么要包含在一個(gè)function里面進(jìn)行返回是因?yàn)樾枰{(diào)整this的指向,上面說過箭頭函數(shù)this指向與定義環(huán)境有關(guān),在say方法的內(nèi)部的this才是指向obj的,如果直接進(jìn)行箭頭函數(shù)賦值,this則會(huì)指向定義環(huán)境window

上面是本人的理解,如果有錯(cuò)誤歡迎指正

2017年4月22日 18:22
編輯回答
故人嘆

在最新的ECMAScript262語言規(guī)范的8.1.1中提到一個(gè)詞叫Environment Recorders,建議有興趣可以看下,在上一版的規(guī)范中貌似叫個(gè)execution context,就是執(zhí)行上下文。

可以這樣理解,在解釋器的實(shí)現(xiàn)中Environment Recorders就是用來記錄一個(gè)環(huán)境棧信息,棧么,就是后進(jìn)先出,通俗點(diǎn)說就是吃多了吐出來,而堆是先進(jìn)先出,就是吃多了拉出來。棧底記錄是的全局環(huán)境,如window 或 global環(huán)境。在函數(shù)執(zhí)行時(shí)記錄器會(huì)把此函數(shù)的執(zhí)行環(huán)境壓入環(huán)境棧,此時(shí)活動(dòng)的就是這個(gè)環(huán)境,那么this指向就引用這個(gè)環(huán)境對(duì)象。當(dāng)執(zhí)行完成時(shí),把這個(gè)環(huán)境從棧頂彈出去?;揪褪沁@么一個(gè)過程,當(dāng)然棧里最少都會(huì)保持一個(gè)環(huán)境。

那什么時(shí)候會(huì)往環(huán)境棧里壓棧值就應(yīng)該能猜的出來,以對(duì)象方法的調(diào)用或人為干預(yù)時(shí),如通過.call,.apply,.bind時(shí)等。object.getNameFunc()的過程就是,object進(jìn)棧--執(zhí)行----->object出棧,等到它返回的匿名函數(shù)運(yùn)行時(shí)環(huán)境棧就只剩全局了,this引用自然訪問到的是'The window'。

至于它說的只會(huì)訪問到活動(dòng)對(duì)象為止,可以這樣驗(yàn)證

var object = {
  getNameFunc : function(){
    console.log(this.name);
    return function(){
      return this.name;
    };
  }
};

console 這一行應(yīng)該打出一個(gè)undefined,而不是打出The window,也就是說當(dāng)前活動(dòng)對(duì)象上沒有,不會(huì)再搜索棧底的其它環(huán)境,這和作用域是不一樣的。

2017年8月21日 02:13