日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

全面解析 Javascript - this

瀏覽:21日期:2023-11-14 16:49:04

全面解析 Javascript - this

為什么要寫這篇文章?

我之前在阿里面試,以及其它公司面試的時候曾經被問到過這個問題,所以想要分享給大家,如果你能清楚地知道下面 this 七種情況的區別,能跟面試官解釋清楚,無疑是一個大大的加分項,理解完這篇文章,面試官再怎么問你 this 都不怕了。

談及 Javascript 中的 this,竟然讓人覺得頭疼,它不像 Java,C++ 中的 this 指向調用 this 的該對象。

在函數中 this 到底取何值,是在函數真正被調用執行的時候確定下來的,函數定義的時候確定不了。

因為 this 的取值是執行上下文環境的一部分,每次調用函數,都會產生一個新的執行上下文環境。當你在代碼中使用了 this,這個 this 的值就直接從執行的上下文中獲取了,而不會從作用域鏈中搜尋。

關于 this 的取值,大體上可以分為以下七種情況:

情況一:全局 & 調用普通函數

在全局環境中,this 永遠指向 window。

console.log(this === window); //true

普通函數在調用時候(注意不是構造函數,前面不加 new),其中的 this 也是指向 window。

var x = 10;function foo(){ console.log(this); //Window console.log(this.x); //10}foo(); 情況二:構造函數

所謂的構造函數就是由一個函數 new 出來的對象,一般構造函數的函數名首字母大寫,例如像 Object,Function,Array 這些都屬于構造函數。

function Foo(){ this.x = 10; console.log(this); //Foo {x:10}}var foo = new Foo();console.log(foo.x); //10

上述代碼,如果函數作為構造函數使用,那么其中的 this 就代表它即將 new 出來的對象。

但是如果直接調用 Foo 函數,而不是 new Foo(),那就變成情況1,這時候 Foo() 就變成普通函數。

function Foo(){ this.x = 10; console.log(this); //Window}var foo = Foo();console.log(foo.x); //undefined 情況三:對象方法

如果函數作為對象的方法時,方法中的 this 指向該對象。

var obj = { x: 10, foo: function () {console.log(this);//Objectconsole.log(this.x); //10 }};obj.foo();

注意:若是在對象方法中定義函數,那么情況就不同了。

var obj = { x: 10, foo: function () {function f(){ console.log(this); //Window console.log(this.x); //undefined}f(); }}obj.foo();

可以這么理解:函數 f 雖然是在 obj.foo 內部定義的,但它仍然屬于一個普通函數,this 仍指向 window。(這是個坑,要記牢)

在這里,如果想要調用上層作用域中的變量 obj.x,可以使用 self 緩存外部 this 變量。

var obj = { x: 10, foo: function () {var self = this;function f(){ console.log(self); //{x: 10} console.log(self.x); //10}f(); }}obj.foo();

如果 foo 函數不作為對象方法被調用:

var obj = { x: 10, foo: function () {console.log(this); //Windowconsole.log(this.x); //undefined }};var fn = obj.foo;fn();

obj.foo 被賦值給一個全局變量,并沒有作為 obj 的一個屬性被調用,那么此時 this 的值是 window。

情況四:構造函數 prototype 屬性

function Foo(){ this.x = 10;}Foo.prototype.getX = function () { console.log(this);//Foo {x: 10, getX: function} console.log(this.x); //10}var foo = new Foo();foo.getX();

在 Foo.prototype.getX 函數中,this 指向的 foo 對象。不僅僅如此,即便是在整個原型鏈中,this 代表的也是當前對象的值。

情況五:函數用 call、apply或者 bind 調用。

var obj = { x: 10}function foo(){ console.log(this); //{x: 10} console.log(this.x); //10}foo.call(obj);foo.apply(obj);foo.bind(obj)();

當一個函數被 call、apply 或者 bind 調用時,this 的值就取傳入的對象的值。

情況六:DOM event this

在一個 HTML DOM 事件處理程序里,this 始終指向這個處理程序所綁定的 HTML DOM 節點:

function Listener(){ document.getElementById(’foo’).addEventListener(’click’, this.handleClick); //這里的 this 指向 Listener 這個對象。不是強調的是這里的 this}Listener.prototype.handleClick = function (event) { console.log(this); //<div id='foo'></div>}var listener = new Listener();document.getElementById(’foo’).click();

這個很好理解,就相當于是給函數傳參,使 handleClick 運行時上下文改變了,相當于下面這樣的代碼:

var obj = { x: 10, fn: function() {console.log(this); //Windowconsole.log(this.x); //undefined }};function foo(fn) { fn();} foo(obj.fn);

你也可以用通過 bind 切換上下文:

function Listener(){ document.getElementById(’foo’).addEventListener(’click’,this.handleClick.bind(this)); }Listener.prototype.handleClick = function (event) { console.log(this); //Listener {}}var listener = new Listener();document.getElementById(’foo’).click();

前六種情況總結一句話為: this 指向調用該方法的對象。

情況七:箭頭函數中的 this

當使用箭頭函數的時候,情況就有所不同了:箭頭函數內部的 this 是詞法作用域,由上下文確定。

var obj = { x: 10, foo: function() {var fn = () => { return () => {return () => { console.log(this); //Object {x: 10} console.log(this.x); //10} }}fn()()(); }}obj.foo();

現在,箭頭函數完全修復了 this 的指向,this 總是指向詞法作用域,也就是外層調用者 obj。

如果使用箭頭函數,以前的這種 hack 寫法:

var self = this;

就不再需要了。

var obj = { x: 10, foo: function() {var fn = () => { return () => {return () => { console.log(this); // Object {x: 10} console.log(this.x); //10} }}fn.bind({x: 14})()()();fn.call({x: 14})()(); }}obj.foo();

由于 this 在箭頭函數中已經按照詞法作用域綁定了,所以,用 call()或者 apply()調用箭頭函數時,無法對 this 進行綁定,即傳入的第一個參數被忽略。

補充說明: this 為保留字,你不能重寫 this。

function test(){ var this = {}; //Uncaught SyntaxError: Unexpected token this} 宿主對象: 一門語言在運行的時候,需要一個環境,叫做宿主環境。 對于JavaScript,宿主環境最常見的是 web 瀏覽器,瀏覽器提供了一個 JavaScript 運行的環境,這個環境里面,需要提供一些接口,好讓 JavaScript 引擎能夠和宿主環境對接。 JavaScript 引擎才是真正執行 JavaScript 代碼的地方,常見的引擎有 V8(目前最快 JavaScript 引擎、Google 生產)、JavaScript core。 在瀏覽器或者服務端( nodejs )都有自己的 JS 引擎,在瀏覽器中,全局對象為 window,而在 nodejs 中,全局對象為 global。

來自:https://zhuanlan.zhihu.com/p/25294187

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精彩视频在线观看| 国产欧美一区二区三区精品观看| 高清av一区| 免费的成人av| 男女性色大片免费观看一区二区| 亚洲精品第一| 欧美国产极品| 99riav国产精品| 精品网站999| 欧美午夜精品一区二区三区电影| 福利在线一区| 久久亚洲美女| 亚久久调教视频| 久久男人天堂| 久久五月天小说| 日本不卡的三区四区五区| 欧美在线综合| 麻豆国产精品视频| 亚洲一区二区动漫| 国产精品麻豆久久| 国产精品一区二区精品| 国产精品地址| 亚洲一区资源| 美女网站一区| 亚洲欧美久久精品| 美女精品久久| 91九色精品国产一区二区| 最新国产精品| 大香伊人久久精品一区二区| 神马午夜久久| 久久久成人网| 成人一二三区| 亚洲精品极品少妇16p| 伊人精品在线| 日韩中文在线电影| 欧美女激情福利| 色偷偷偷在线视频播放| 激情久久99| 福利一区视频| 三级小说欧洲区亚洲区| 欧美中文字幕一区二区| 亚洲天堂成人| 中文一区一区三区高中清不卡免费| 国产精品一区二区免费福利视频| 伊人久久婷婷| 99久久久久| 一区免费在线| 日韩视频一区二区三区在线播放免费观看| 国产成人久久精品麻豆二区| 亚洲精品看片| 久久国产福利| 天堂久久一区| 国产精品www.| 精品一区不卡| 日韩精品电影| 久久一区二区三区电影| 9久re热视频在线精品| 99精品视频在线| 久久国产精品99国产| 日本欧美久久久久免费播放网| 高清一区二区| 91成人在线网站| 亚洲电影有码| 日本不卡一二三区黄网| 国产精品videossex久久发布| 欧美三区四区| 午夜电影一区| 日韩免费精品| 欧美日韩调教| 日韩一区二区在线免费| 国产图片一区| 精品国产乱码久久久久久1区2匹| 精品久久精品| 视频一区在线视频| 国产精品亚洲综合色区韩国| 国产精品毛片在线| 欧美专区在线| 欧美国产亚洲精品| 国产精品美女久久久久久不卡| 欧美黄页在线免费观看| 日韩黄色大片网站| 亚洲理论在线| 国产成人精品亚洲线观看| 亚洲18在线| 国产精品玖玖玖在线资源| 999久久久国产精品| 国产精品一区二区三区四区在线观看| 久久青草久久| 国产成人精品免费视| 精品日韩一区| 日韩欧美在线中字| 国产精品成人国产| 香蕉成人av| 国产精品一区二区三区av麻| 另类av一区二区| 欧美女激情福利| 亚洲免费毛片| 日韩不卡手机在线v区| 丝袜国产日韩另类美女| 精品国产一区二区三区av片| 亚洲区第一页| 99精品在线观看| 99在线精品免费视频九九视| 国产一区一一区高清不卡| 美女精品一区二区| 免费黄色成人| 欧美一级精品| 国产成人精选| 福利一区二区| 电影91久久久| 久久99青青| 国产精品免费精品自在线观看| 蜜桃一区二区三区在线观看| 播放一区二区| 亚洲成av在线| 亚洲精品888| av不卡在线| 蜜臀久久99精品久久久久宅男| 香蕉国产精品| 日韩在线观看一区二区| 91精品日本| 欧美日韩国产观看视频| 久久午夜精品| 亚洲最新无码中文字幕久久| 一区二区三区四区日韩| 午夜一级久久| 麻豆精品蜜桃| 欧美99久久| 国产精品欧美日韩一区| 久久精品国产在热久久| 日本在线啊啊| 午夜在线精品偷拍| 久久国产精品免费一区二区三区| 国产欧美日韩一级| 久久久精品区| aⅴ色国产欧美| 日本不卡中文字幕| 精品三区视频| 精品国产美女a久久9999| 日韩成人午夜精品| 日本中文字幕视频一区| 欧美丰满日韩| 玖玖精品视频| 国产精品白丝一区二区三区| 国产亚洲一区二区手机在线观看| 国产欧美视频在线| 水野朝阳av一区二区三区| 四虎8848精品成人免费网站| 中文字幕一区二区三区在线视频| 国产自产自拍视频在线观看| 婷婷精品在线观看| 伊人久久亚洲美女图片| 久久一区二区三区喷水| 成人日韩精品| 久久男女视频| 韩国三级一区| 亚洲免费福利| 99亚洲视频| 亚洲高清久久| 久久久精品日韩| 综合日韩av| 麻豆视频久久| 精品国产亚洲一区二区三区在线 | 久久性天堂网| 亚洲三级毛片| 天堂va欧美ⅴa亚洲va一国产| 日韩精品一区二区三区中文 | 日本强好片久久久久久aaa| 亚洲精品乱码| 欧美精品二区| 日韩不卡视频在线观看| 日韩二区三区四区| 亚洲一区观看| 欧美好骚综合网| 欧美日韩亚洲一区在线观看| 国产亚洲久久| 国产精品久久久久久久久久白浆 | 亚洲资源网站| 日韩不卡免费视频| 一区视频在线| 日韩高清二区| 欧美日一区二区三区在线观看国产免| 国产日韩欧美中文在线| 国产高清精品二区| 成人在线黄色| 国产精品羞羞答答在线观看| 国产日韩欧美一区二区三区 | 精品三级在线观看视频| 亚洲精品在线影院| 国产乱码精品一区二区亚洲| 精品精品99| 国产一区亚洲| 日韩不卡一区二区| 在线看片日韩| 卡一卡二国产精品| 久久要要av| 久久都是精品| 欧美精品九九| 亚洲精品免费观看| 国产乱子精品一区二区在线观看|