摘要:一前言普通定義的函數(shù)運(yùn)行環(huán)境也是對象,指向運(yùn)行時所在的對象。箭頭函數(shù)函數(shù)體內(nèi)的對象,就是定義時所在的對象,而不是使用時所在的對象。
一、前言 普通function定義的函數(shù)
‘運(yùn)行環(huán)境’也是對象,this指向運(yùn)行時所在的對象。
如下:
如果一個函數(shù)在全局環(huán)境運(yùn)行,this就指向頂層對象(瀏覽器中為window對象);箭頭函數(shù)
如果一個函數(shù)作為某個對象的方法運(yùn)行,this就指向那個對象;
如果一個函數(shù)作為構(gòu)造函數(shù),this指向它的實(shí)例對象。
函數(shù)體內(nèi)的this對象,就是定義時所在的對象,而不是使用時所在的對象。
本來記住這幾點(diǎn)已經(jīng)可以了,this最終找到是可能window,但是undefined是怎么又是怎么來的,本妹子下面將一步步分析。
二、問題點(diǎn):undefined是怎么來的綜上所述,this指向運(yùn)行時所在的對象或指向定義時所在的對象,但是這個對象可能最后找到是window,但都不可能是undefined,那么undefined是怎么來的呢?
三、回答
我們一般寫js文件都是babel轉(zhuǎn)成ES6的,babel會自動給js文件上加上嚴(yán)格模式。
用了嚴(yán)格模式"use strict",嚴(yán)格模式下無法再意外創(chuàng)建全局變量
),所以this不為window而為undefined
四、進(jìn)階問題:嚴(yán)格模式對箭頭函數(shù)沒有效果
嚴(yán)格模式為什么對箭頭函數(shù)沒有效果,返回還是window?
五、進(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ù)中,this為lexical 類型,lexical意味著這個this指是所在封閉函數(shù)中this,所以嚴(yán)格模式會自動忽視use strict,所以this如下所示:
箭頭函數(shù)中,this指向運(yùn)行時所在的對象,而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)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106825.html
摘要:在初始化代碼時會先進(jìn)入全局上下文中,每當(dāng)一個函數(shù)被調(diào)用時就會為該函數(shù)創(chuàng)建一個執(zhí)行上下文,每個函數(shù)都有自己的執(zhí)行上下文。來看一段代碼這段代碼有個執(zhí)行上下文全局上下文和,,屬于自己的執(zhí)行上下文。 聊聊js的執(zhí)行上下文 一,相關(guān)概念 EC : 執(zhí)行上下文ECS : 執(zhí)行環(huán)境棧VO : 變量對象AO : 活動對象scope chain :作用域鏈 二,執(zhí)行上下文 javascript運(yùn)行的代碼...
摘要:引擎會執(zhí)行其執(zhí)行環(huán)境位于堆棧頂部的函數(shù)。當(dāng)函數(shù)執(zhí)行完畢時,當(dāng)前執(zhí)行棧會從堆棧中彈出去,并且控件將會到達(dá)其在當(dāng)前堆棧下面的那個執(zhí)行環(huán)境中。當(dāng)完成以后,它的執(zhí)行環(huán)境會會從堆棧中移出,并且控件會到達(dá)全局執(zhí)行環(huán)境。 如果你想成為一個Javascript開發(fā)者,那么你一定要知道Javascript程序的內(nèi)部運(yùn)行原理。理解執(zhí)行環(huán)境和執(zhí)行棧是非常重要的,其有助于理解其他Javascript的概念,比...
摘要:運(yùn)行執(zhí)行上下文正在使用的執(zhí)行上下文。頂部是正在執(zhí)行的上下文當(dāng)執(zhí)行完畢,它的執(zhí)行上下文自動從棧彈出,控制流程按順序到達(dá)全局執(zhí)行上下文。一旦所有代碼執(zhí)行完畢,引擎從當(dāng)前棧中移除全局執(zhí)行上下文。在全局執(zhí)行上下文中,的值指向全局對象。 https://juejin.im/post/5ba321...https://juejin.im/entry/59986...我只是搬運(yùn)工,看了他們的文章后深...
摘要:理解執(zhí)行上下文和執(zhí)行堆棧對于理解的其它概念如提升,范圍和閉包至關(guān)重要。正確地理解執(zhí)行上下文和執(zhí)行堆棧將幫助你更好地使用開發(fā)應(yīng)用。引擎執(zhí)行位于執(zhí)行堆棧頂部的方法。當(dāng)調(diào)用時,為該函數(shù)創(chuàng)建一個新的執(zhí)行上下文,并且把它推入到當(dāng)前執(zhí)行堆棧。 By Sukhjinder Arora | Aug 28, 2018 原文 如果你是或者你想要成為一名js開發(fā)者,那么你必須了解js程序內(nèi)部的運(yùn)作。理解執(zhí)行...
摘要:執(zhí)行上下文棧首先我們先了解一下什么是執(zhí)行上下文棧。那么隨著我們的執(zhí)行上下文數(shù)量的增加,引擎又如何去管理這些執(zhí)行上下文呢這時便有了執(zhí)行上下文棧。這樣由多個執(zhí)行上下文的變量對象構(gòu)成的鏈表就叫做作用域鏈。 執(zhí)行上下文棧 首先我們先了解一下什么是執(zhí)行上下文棧(Execution context stack)。 showImg(https://segmentfault.com/img/remot...
閱讀 2715·2019-08-30 15:53
閱讀 2901·2019-08-29 16:20
閱讀 1108·2019-08-29 15:10
閱讀 1051·2019-08-26 10:58
閱讀 2220·2019-08-26 10:49
閱讀 660·2019-08-26 10:21
閱讀 734·2019-08-23 18:30
閱讀 1658·2019-08-23 15:58