鍍金池/ 問答/HTML/ 關(guān)于this的又一個問題

關(guān)于this的又一個問題

本人正在看《你不知道的javascript上卷》,第80頁其有關(guān)使用this來隱式引用函數(shù)的詞法作用域錯誤代碼如下:

function foo(){
  var a = 2;
  this.bar();    //1
}
function bar(){
  console.log(this.a);
}
foo();

我在VS Code上將代碼注釋1處的this給刪掉之后(如書中所說)發(fā)現(xiàn)盡管代碼沒有出錯但是結(jié)果為undefined。在單步調(diào)試查看調(diào)用堆棧時是foo->bar,也就是按照我所想的bar()中this綁定到了foo函數(shù)對象上。
圖片描述

百思不得其解之后在全局和bar函數(shù)中都另外再定義了不同值的a變量,然而結(jié)果還是undefined。。。突然想到是不是因為自動使用嚴(yán)格模式的原因,然而在各個瀏覽器控制臺上測試同樣是undefined的結(jié)果,無解。。。。。求助!!這個this到底綁定到哪里了?。?/p>

回答
編輯回答
半心人
  1. 在這個例子里,想在bar里面訪問foo作用域中的變量是不可能的
  2. 在瀏覽器中,bar中的this指向全局變量。在node中不是
2018年2月22日 00:18
編輯回答
扯機薄

bar中的thsi.a是沒有的啊

2017年9月6日 21:05
編輯回答
六扇門

this是全局的window對象,a在你的foo方法里,是局部變量。所以是未定義。你可以看看這個,js this的四種場景。

2017年6月19日 07:57
編輯回答
做不到

this的作用域和它運行的環(huán)境有關(guān),它指向調(diào)用某方法、對象的對象。比如這里,如果是node.js,就會一直指向global;如果是瀏覽器,就會一直指向window。不過node.js環(huán)境下,在最外面一層以var a = 1形式聲明的變量,并不會綁定在node.js 的global上,以a = 1類似的方式聲明。

2017年4月29日 14:13
編輯回答
久舊酒

undefined 沒毛病啊,“光桿司令”調(diào)用。看完之后不要再問我this,強力推薦:https://segmentfault.com/a/11...

2018年9月9日 12:15
編輯回答
風(fēng)畔

如果去掉了 foo() 中 bar() 前面的 this,bar 的調(diào)用堆棧確實是 foo->bar,也就是說 bar 的調(diào)用位置在 foo 中。但是你有一個誤解,「調(diào)用位置決定了 this 的綁定」并不是說只要找到調(diào)用位置就可以判斷 this 的綁定了。
找到調(diào)用位置是判斷 this 綁定的第一步,第二步要在調(diào)用位置運用 this 綁定的規(guī)則判斷此時 this 屬于哪種綁定,進而找到 this 的綁定對象。這一點在《你不知道的 js》第 83 頁下方有明確講解。

在這段代碼中,我們找到了 bar 的調(diào)用位置,然后發(fā)現(xiàn)它是一個普通的函數(shù)調(diào)用,不是對象方法引用也沒有使用綁定函數(shù)。所以 this 會應(yīng)用默認(rèn)綁定(《你不知道的 js》第 83 與 84 頁),也就是 this 綁定到全局對象,而全局對象中沒有 a 這個屬性。根據(jù)詞法作用域在非嚴(yán)格模式下的查找規(guī)則,這會返回一個值為 undefined 的 a。

2017年7月4日 03:59
編輯回答
骨殘心

瀏覽器里面普通函數(shù)調(diào)用,this是window,node里面是global,全局環(huán)境的this瀏覽器還是window,node是module.exports this是誰只取決于函數(shù)怎么調(diào)用的

2017年10月9日 15:04