this為什么會(huì)為undefined?

一、前言

普通function定義的函數(shù)

‘運(yùn)行環(huán)境’也是對(duì)象,this指向運(yùn)行時(shí)所在的對(duì)象。
如下:

如果一個(gè)函數(shù)在全局環(huán)境運(yùn)行,this就指向頂層對(duì)象(瀏覽器中為window對(duì)象);
如果一個(gè)函數(shù)作為某個(gè)對(duì)象的方法運(yùn)行,this就指向那個(gè)對(duì)象;
如果一個(gè)函數(shù)作為構(gòu)造函數(shù),this指向它的實(shí)例對(duì)象。

箭頭函數(shù)

函數(shù)體內(nèi)的this對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。

本來記住這幾點(diǎn)已經(jīng)可以了,this最終找到是可能window,但是undefined是怎么又是怎么來的,本妹子下面將一步步分析。

二、問題點(diǎn):undefined是怎么來的

綜上所述,this指向運(yùn)行時(shí)所在的對(duì)象或指向定義時(shí)所在的對(duì)象,但是這個(gè)對(duì)象可能最后找到是window,但都不可能是undefined,那么undefined是怎么來的呢?

<html>
<script type="text/javascript">
var foo = function foo() {
    console.log(this);
};
var foo1 = () => {
    console.log(this);
};
foo(); //Window
foo1(); //Window
</script>
</html>

三、回答

我們一般寫js文件都是babel轉(zhuǎn)成ES6的,babel會(huì)自動(dòng)給js文件上加上嚴(yán)格模式。

image.png

用了嚴(yán)格模式"use strict",嚴(yán)格模式下無法再意外創(chuàng)建全局變量,所以this不為window而為undefined

<html>
<script type="text/javascript">
"use strict";  
var foo = function foo(){
    console.log(this)
};
foo();//undefined
</script>
</html>

四、進(jìn)階問題:嚴(yán)格模式對(duì)箭頭函數(shù)沒有效果

嚴(yán)格模式為什么對(duì)箭頭函數(shù)沒有效果,返回還是window?

<html>
<script type="text/javascript">
"use strict";
var foo = () => {
    console.log(this)
};
foo(); //Window
</script>
</html>

五、進(jìn)階問題回答

Given that this comes from the surrounding lexical context, strict mode rules with regard to this are ignored.

lexical means that this refers to the this value of a lexically enclosing function.

綜上所述,在箭頭函數(shù)中,thislexical類型,lexical意味著這個(gè)this指是所在封閉函數(shù)中this,所以嚴(yán)格模式會(huì)自動(dòng)忽視use strict,所以this如下所示:

<html>
<script type="text/javascript">
var foo = () => {
    "use strict";
    console.log(this)
};
foo(); //Window
</script>
</html>

箭頭函數(shù)中,this指向運(yùn)行時(shí)所在的對(duì)象,而use strict被移到函數(shù)內(nèi)了,所以this為全局變量window。

Happy coding ~~ ^ ^

相關(guān)鏈接

原文地址

嚴(yán)格模式 - JavaScript

Arrow functions - JavaScript

ECMAScript 2015 Language Specification – ECMA-262 6th Edition

函數(shù)的擴(kuò)展 - ECMAScript 6入門

use strict in javascript not working for fat arrow? - Stack Overflow

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.概念 在JavaScript中,this 是指當(dāng)前函數(shù)中正在執(zhí)行的上下文環(huán)境,因?yàn)檫@門語言擁有四種不同的函數(shù)調(diào)...
    BluesCurry閱讀 1,253評(píng)論 0 2
  • 新手在入門 JavaScript 的過程中,一定會(huì)踩很多關(guān)于 this 的坑,出現(xiàn)問題的本質(zhì)就是 this 指針的...
    一縷殤流化隱半邊冰霜閱讀 3,935評(píng)論 15 47
  • 1. this之謎 在JavaScript中,this是當(dāng)前執(zhí)行函數(shù)的上下文。因?yàn)镴avaScript有4種不同的...
    百里少龍閱讀 1,104評(píng)論 0 3
  • 涵義 this關(guān)鍵字是一個(gè)非常重要的語法點(diǎn)。毫不夸張地說,不理解它的含義,大部分開發(fā)任務(wù)都無法完成。 首先,thi...
    許先生__閱讀 678評(píng)論 0 4
  • 關(guān)于 this this 關(guān)鍵字是 JavaScript 中最復(fù)雜的機(jī)制之一。它是一個(gè)很特別的關(guān)鍵字,被自動(dòng)定義在...
    游學(xué)者灬墨槿閱讀 639評(píng)論 1 2

友情鏈接更多精彩內(nèi)容