摘要:學(xué)習筆記頂層對象雖然是筆記但是基本是抄了一次大師的文章了頂層對象頂層對象,在瀏覽器環(huán)境指的是對象,在指的是對象。之中,頂層對象的屬性與全局變量是等價的。的寫法模塊的寫法上面代碼將頂層對象放入變量。參考引用頂層對象實戰(zhàn)
es6學(xué)習筆記-頂層對象_v1.0
(雖然是筆記,但是基本是抄了一次ruan大師的文章了)
頂層對象頂層對象,在瀏覽器環(huán)境指的是window對象,在Node指的是global對象。
ES5之中,頂層對象的屬性與全局變量是等價的。
ES6為了改變這一點:
var命令和function命令聲明的全局變量,依舊是頂層對象的屬性;
let命令、const命令、class命令聲明的全局變量,不屬于頂層對象的屬性
global對象瀏覽器里面,頂層對象是window,
但 Node 和 Web Worker 沒有window。
瀏覽器和 Web Worker 里面,self也指向頂層對象
但是Node沒有self,Node 里面,頂層對象是global,但其他環(huán)境都不支持。
同一段代碼為了能夠在各種環(huán)境,都能取到頂層對象,現(xiàn)在一般是使用this變量,但是有局限性(如下):
全局環(huán)境中,this會返回頂層對象。但是,Node模塊和ES6模塊中,this返回的是當前模塊。(所以在node命令行下解析es6代碼,this指向并不是全局對象)
函數(shù)里面的this,如果函數(shù)不是作為對象的方法運行,而是單純作為函數(shù)運行,this會指向頂層對象。但是,嚴格模式下,這時this會返回undefined。不管是嚴格模式,還是普通模式,new Function("return this")(),總是會返回全局對象。
如果瀏覽器用了CSP(Content Security Policy,內(nèi)容安全政策),那么eval、new Function這些方法都可能無法使用。
// 方法一 (typeof window !== "undefined" ? window : (typeof process === "object" && typeof require === "function" && typeof global === "object") ? global : this); // 方法二 var getGlobal = function () { if (typeof self !== "undefined") { return self; } if (typeof window !== "undefined") { return window; } if (typeof global !== "undefined") { return global; } throw new Error("unable to locate global object"); };
typeof process === "object" && typeof require === "function" && typeof global === "object"如果為true,且不存在window對象時可以認為在node環(huán)境中,node的全局對象就是global等價于瀏覽器中的window對象。這個是node的定義,參考node官方
self(window.self) 返回window的只讀引用,即為一個頂層對象,所以typeof self !== "undefined"時,可以認為在瀏覽器環(huán)境下獲取到了頂層對象的一個只讀引用
typeof global !== "undefined"這個就是獲取的node環(huán)境下的頂層對象,觀察這兩個函數(shù),其作用都是獲取頂層對象,一般來說js較多用到的地方是瀏覽器端(前端)和node端(后臺),
參考segmentfault
加入墊片庫來實現(xiàn)global對象在語言標準的層面,引入global作為頂層對象。也就是說,在所有環(huán)境下,global都是存在的,都可以從它拿到頂層對象。
墊片庫system.global模擬了這個提案,可以在所有環(huán)境拿到global。
// CommonJS的寫法 require("system.global/shim")(); // ES6模塊的寫法 import shim from "system.global/shim"; shim(); 上面代碼可以保證各種環(huán)境里面,global對象都是存在的。 // CommonJS的寫法 var global = require("system.global")(); // ES6模塊的寫法 import getGlobal from "system.global"; const global = getGlobal(); 上面代碼將頂層對象放入變量global。
參考引用:
es6-頂層對象
es實戰(zhàn)2015
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86802.html
摘要:考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級作用域內(nèi)聲明函數(shù)。函數(shù)聲明語句函數(shù)表達式循環(huán)循環(huán)還有一個特別之處,就是循環(huán)語句部分是一個父作用域,而循環(huán)體內(nèi)部是一個單獨的子作用域。聲明一個只讀的常量。 es6學(xué)習筆記-let,const和塊級作用域_v1.0 塊級作用域 javascript 原來是沒有塊級作用域的,只有全局作用域和函數(shù)作用域 例子1 因為沒有塊級作用域,所以每次的i都是一...
摘要:因為箭頭函數(shù)本身沒有所以不可以當作構(gòu)造函數(shù),也就是說,不可以使用命令,否則會拋出一個錯誤。箭頭函數(shù)不可以使用對象,該對象在函數(shù)體內(nèi)不存在。 es6學(xué)習筆記-箭頭函數(shù)_v1.0 箭頭函數(shù)使用方法 var f = v => v; //普通函數(shù)配合箭頭函數(shù)寫法,這里并且是傳參的 //相當于 var f = function(v) { return v; }; /*-----------...
摘要:學(xué)習筆記數(shù)值的擴展有一些不常用或者還不支持的就沒有記錄了總體來說本篇只是一個備忘而已用來檢查一個數(shù)值是否為有限的。兩個新方法只對數(shù)值有效,非數(shù)值一律返回。參考引用數(shù)值擴展 es6學(xué)習筆記-數(shù)值的擴展 有一些不常用或者還不支持的就沒有記錄了,總體來說本篇只是一個備忘而已 Number.isFinite(), Number.isNaN() Number.isFinite()用來檢查一個數(shù)值...
摘要:學(xué)習筆記函數(shù)擴展函數(shù)參數(shù)的默認值如果參數(shù)默認值是變量,那么參數(shù)就不是傳值的,而是每次都重新計算默認值表達式的值。屬性函數(shù)的屬性,返回該函數(shù)的函數(shù)名。箭頭函數(shù)詳細鏈接參考引用函數(shù)擴展 es6學(xué)習筆記-函數(shù)擴展_v1.0 函數(shù)參數(shù)的默認值 function Point(x = 0, y = 0) { this.x = x; this.y = y; } var p = ne...
摘要:學(xué)習筆記字符串的擴展字符的表示法允許使用的形式表示一個字符,但在之前,單個碼點僅支持到,超出該范圍的必須用雙字節(jié)形式表示,否則會解析錯誤。返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。,是引入了字符串補全長度的功能。 es6學(xué)習筆記-字符串的擴展_v1.0 字符的Unicode表示法 JavaScript 允許使用uxxxx的形式表示一個字符,但在 ES6 之前,單個碼點僅支持u00...
閱讀 3207·2023-04-25 16:50
閱讀 941·2021-11-25 09:43
閱讀 3566·2021-09-26 10:11
閱讀 2547·2019-08-26 13:28
閱讀 2558·2019-08-26 13:23
閱讀 2457·2019-08-26 11:53
閱讀 3601·2019-08-23 18:19
閱讀 3018·2019-08-23 16:27