NodeJS和瀏覽器中this關鍵字的不同之處

前言

學習過JavaScript的人肯定清楚 處在不同環境下this的指向問題。那麼看下面的代碼

var type = 1
function toWhere(){
	this.type = 2;
}
toWhere();
console.log(type)

你們肯定會這樣想:

這裡聲明瞭一個全局變量type,當執行type=1的時候,賦值為1。之後toWhere函數調用,看到函數中有this 就去判斷this的指向,這裡很清楚,this指向瞭window,this.type=2執行後,全局變量type就賦值為2瞭。

最後打印全局變量type 結果很明顯是2。

打開瀏覽器驗證一下,沒問題 一個2明晃晃的在那裡。

那麼就這樣結束瞭嗎?

如果你學過node,現在用nodejs重新執行一下以上代碼,你就發現瞭不一樣的地方。

你現在發現 那個1怎麼這麼不對勁呢,不是等於2嗎?

相關調試

從以上的例子可以看到,相同的js代碼在瀏覽器中運行和在nodejs中運行結果變得不一樣瞭。

這其實是因為this指向問題,但是這個指向和我們通常認知中的指向是不一樣的。這個指向問題是由於node工作原理造成的

var type = 1
function toWhere() {
 this.type = 2
 console.log("函數中this指向",this)
}
toWhere()
console.log(type)
console.log("全局中this",this)

1、打印瀏覽器中的this

函數中this指向瞭window,而全局的this也是指向瞭window

2、打印nodeJs中的this

發現瞭吧。函數中的this指向瞭Object [global]。

當我們給函數this賦值時,其實它掛靠在global對象上。所以它不會去改變全局中this的值

Node原理解析

那麼看看為什麼會這樣

首先我們得去瞭解nodeJs的工作原理

瀏覽器直接在全局范圍執行的腳本文件

而在Node中,Node將代碼隱藏在一個立即被調用的匿名函數,你可以使用global來訪問全局范圍

在之前的解釋中,我們會發現在外部打印的一個this,它指向瞭一個空對象{},其實在node中運行的任何文件其實都被包裹在一個{}中,所以腳本文件都在自己的閉包中執行, 類似於下面這樣

{
	(function(){
		//腳本文件
	})()
}

在之前的例子中,函數的外面this指向的是一個空對象{},而在函數內部的this沒有指定的執行上下文,所以它指向瞭global對象-(可以訪問該匿名函數執行上下文的全局范圍)

總結

到此這篇關於NodeJS和瀏覽器中this關鍵字不同之處的文章就介紹到這瞭,更多相關NodeJS 瀏覽器中this關鍵字內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: