2016-02-05 54 views
2

注意:這只是出於好奇,而不是我這樣的攔截器。NodeJS中GLOBAL變量的祕密

當我正在處理我的NODE項目時,我遇到了一些讓我困惑的事情,但我找不到爲什麼會這樣。請找樣本代碼來了解這個問題

function a() { 
    console.log(this === GLOBAL); //true 
}  
console.log(this === GLOBAL);  // false 
a(); 

現在,in node documentation上面清清楚楚地寫着

頂級範圍不是全局範圍

,所以我從上面的註釋,爲什麼理解thisfalse以外的function a(頂級)。但後來裏面function athis指向GLOABAL,爲什麼呢?

我使用node-5.5.0,但我檢查的行爲上node-0.12,其一貫

可能是它的一些愚蠢的誤解,從我的身邊,多包涵。

UPDATE:由的方式 - 在頂層thismodule.exports,和this在函數內部是GLOBAL

+1

你在混淆兩個不同的概念。 「this」的價值與範圍無關。 – Quentin

+0

@Quentin:我試圖爲「任何函數之外的JS代碼」(如瀏覽器中的全局範圍)找到一個名稱,在這個問題中,我只是指不同範圍內的上下文。編輯問題 – Oxi

+0

查看[存儲在node.js中的模塊變量在什麼範圍內?](http://stackoverflow.com/q/15406062/1048572) – Bergi

回答

1

您的問題與節點本身無關,但與ECMAScript規範本身無關。您可能想了解Lexical EnvironmentsExecution Contexts

this在函數調用中僅爲global,因爲您處於非嚴格模式;如果您要使用'use strict';編譯指示,則this將不確定。

The MDN給出了一些洞察:

首先,作爲本傳遞給在嚴格模式的函數的值沒有被強制進入作爲(又名「盒裝」)的對象。對於一個正常的函數,這總是一個對象:要麼提供的對象,如果用一個對象賦值this來調用;如果使用布爾值,字符串或數字調用此值,則裝箱;或者全局對象如果使用undefined或null調用。 (使用調用,應用或綁定來指定特定的這一點。)不僅自動裝箱成爲性能成本,而且暴露瀏覽器中的全局對象也是一種安全隱患,因爲全局對象提供對「安全」JavaScript環境功能的訪問必須限制。因此,對於嚴格模式功能,指定該未盒裝到對象,並且如果未指定的,這將是未定義

所以,在非嚴格模式,this在函數內部將默認爲global


引擎蓋下,節點模塊被包裹在一個函數調用,這將給你訪問exportsrequiremodule__filename__dirname變量:

(function (exports, require, module, __filename, __dirname) { 
    // your actual code will be injected here 
}); 

此功能是通過運行作爲背景的exports(即this)。

0

在JavaScript中,的this值可引起許多混亂。我會盡力解釋只是相關這裏是位:

    在「獨立」功能
  • this成爲一個方法全局對象
  • (即附加到對象的函數)this成爲其方法被稱爲的對象

例如,

function a() { console.log(this) } 
a() //-> logs the global object (window in the browser, global in node) 

var obj = { a: function() { console.log(this) } } 
obj.a() //-> logs 'obj' 

你的this觀察被設置爲全局是不是唯一的節點,是在瀏覽器中也是如此。 JavaScript中有一種叫做「嚴格模式」的東西,當它被啓用時,在我們正在談論的情況下使得值爲this=undefined,這是一個更合理的價值。

如果您想了解更多關於thishttp://www.2ality.com/2014/05/this.html的信息,本文內容非常豐富。

+1

當一個函數中* not *時,OP似乎會詢問'this'。 – Bergi

+0

@Ben:那麼我的問題主要是關於nodejs中的'module.exports'(不適用於瀏覽器),'strict mode'或'non strict mode'。無論如何,Berge提供的鏈接和其他一些閱讀清除它。謝謝 – Oxi

+0

@Bergi我認爲這是問題的癥結所在「但在函數內部,這指向GLOABAL,爲什麼是這樣的:)」 –