什么是 BOM
BOM 即瀏覽器對(duì)象模型(browser object model),其提供了一系列接口供開發(fā)者使用 JavaScript
與瀏覽器窗口進(jìn)行交互。
BOM 不像 ECMAScript 和 DOM 有一套自己的標(biāo)準(zhǔn),BOM 是沒有公共組織制定標(biāo)準(zhǔn)的。
神奇的是所有現(xiàn)代瀏覽器在 BOM 的相關(guān)內(nèi)容上幾乎一致,所以 BOM 也足夠通用,所有瀏覽器的實(shí)現(xiàn)幾乎一致。
1. BOM 的作用
BOM 提供的是與瀏覽器窗口交互的能力,其包含了一些處理窗口的方法,如打開新窗口,控制新窗口大小,也提供了窗口相關(guān)的屬性,如窗口尺寸。
BOM 的操作入口可以理解為 window
對(duì)象,即瀏覽器下的全局對(duì)象。
window.location.href = '//imooc.com'; // 跳轉(zhuǎn)
window.onload = function() {
// 當(dāng)前窗口的頁(yè)面加載完畢做的事情
};
window.open('https://immoc.com'); // 打開新的窗口
window.navigator.userAgent; // 獲取 UA
2. 理解 BOM、DOM、JS 的關(guān)系
部分讀者可能會(huì)進(jìn)入一個(gè)難以理解的怪圈。
全局的對(duì)象,如 String
、Boolean
、Function
,或者一些方法 parseInt
,isNaN
,甚至是 DOM 的入口 document
,這些都是被放在 window
下供開發(fā)者訪問(wèn)的。
而 BOM 沒有自己的標(biāo)準(zhǔn),也基本和這些東西沒有半毛關(guān)系,為什么這些內(nèi)容會(huì)被放在作為 BOM 操作的入口的 window
對(duì)象下呢?
之前也有提過(guò),JavaScript 有他自己獨(dú)立的標(biāo)準(zhǔn),本身是不具備和瀏覽器交互的特性的,交互的接口都由瀏覽器來(lái)提供。
在 ECMAScript 的標(biāo)準(zhǔn)中,這些全局的對(duì)象都是被放在 Global
上的,而標(biāo)準(zhǔn)又沒指出如何直接訪問(wèn) Global
對(duì)象,所以在瀏覽器上這個(gè)所謂的 Global
就被 window
對(duì)象所替代,所有 Global
下的內(nèi)容全部被放到了 window
下。
window
對(duì)象就這樣作為了全局對(duì)象,并且 DOM 相關(guān)的內(nèi)容,與窗口交互的方式都放在了 window
對(duì)象下。
擴(kuò)展:globalThis
globalThis
指向當(dāng)前環(huán)境的全局的this,也可以理解為指向全局對(duì)象。
這個(gè)屬性在瀏覽器中指向的就會(huì)是window
,而在node
環(huán)境下指向的就是global
。
這個(gè)屬性最大的好處就是開發(fā)通用的庫(kù)不必要再使用 window 或 global 這樣的標(biāo)志性對(duì)象來(lái)判斷當(dāng)前的宿主環(huán)境。
需要注意的是 globalThis 還是試驗(yàn)性的內(nèi)容,chrome 和 新版本的 node 已經(jīng)支持。
3. window.window.window.window…window
window 對(duì)象下還有一個(gè)名為 window
的屬性,其指向 window 對(duì)象。
也就是說(shuō)可以像套娃一樣無(wú)限套。
這樣設(shè)計(jì)也是有原因的,假設(shè)沒有 window.window
這個(gè)屬性,那就訪問(wèn)不到全局的 window
了,這就等于不能直接訪問(wèn)到全局對(duì)象,如果想要訪問(wèn)直接訪問(wèn) window 對(duì)象,則必須自建一個(gè)變量用于放置 window 對(duì)象。
var window = this; // 在代碼最外層
window.location.href = 'https://imooc.com';
4. 小結(jié)
BOM 沒有自己的標(biāo)準(zhǔn),在瀏覽器中 window 對(duì)象就是 BOM 相關(guān)內(nèi)容的入口。
window 對(duì)象是 BOM 相關(guān)內(nèi)容的入口。
在瀏覽器環(huán)境中,window 對(duì)象就是全局對(duì)象,所有 DOM 相關(guān)內(nèi)容與 ECMAScript 描述的全局對(duì)象等內(nèi)容也被放在 window 對(duì)象下。