1拗小、瀏覽器環(huán)境下
window和this的關(guān)系:全局作用域下的this就等于window
console.log(window === this);//true
var a = 1;
var b = function () {
return "function1";
}
console.log(window.a); //1
console.log(window.b); //? (){ return "function1"; }
console.log(window.a === a); //true
console.log(window.b === b); //true
在全局對象上定義的變量可以直接訪問
window.aa = 2;
this.bb = function () {
return "function2";
}
console.log(aa); //2
console.log(bb); //? (){ return "function2"; }
瀏覽器環(huán)境下獲取全局對象的方式:window蚪拦,self肆资,frames根吁,this
console.log(self.aa);//2
console.log(frames.aa);//3
console.log(self===this);//true
console.log(frames===this);//true
2锤岸、node環(huán)境下
node中的全局對象是global擦秽,但是this并不指向gloabl
定義的全局變量并不會綁定到全局對象gloabl身上合呐,但是可以往global身上添加屬性
console.log(this === global);//false
var a="global -> a";
global.b="global -> b";
var obj={
a: "obj -> a",
test: function() {
console.log(this.a);//obj -> a
console.log(global);
console.log(global.a);//undefined
console.log(global.b);//global -> b
}
}
obj.test();
上面程序中console.log(global)
語句輸出的gloabl對象為:
<ref *1> Object [global] {
global: [Circular *1],
clearInterval: [Function: clearInterval],
clearTimeout: [Function: clearTimeout],
setInterval: [Function: setInterval],
setTimeout: [Function: setTimeout] {
[Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
},
queueMicrotask: [Function: queueMicrotask],
clearImmediate: [Function: clearImmediate],
setImmediate: [Function: setImmediate] {
[Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
},
b: 'global -> b'
}
3暮的、globalThis
在以前,從不同的 JavaScript 環(huán)境中獲取全局對象需要不同的語句淌实。在 Web 中冻辩,可以通過 window、self 或者 frames 取到全局對象拆祈,但是在 Web Workers 中恨闪,只有 self 可以。在 Node.js 中放坏,它們都無法獲取咙咽,必須使用 global。
在松散模式下淤年,可以在函數(shù)中返回 this 來獲取全局對象钧敞,但是在嚴格模式和模塊環(huán)境下,this 會返回 undefined麸粮。
function test1(){
"use strict"
return this;
}
function test2(){
return this;
}
console.log(test1());//undefined
console.log(test2());//Window {...}
console.log(window.test1());//Window {...}
globalThis
提供了一個標(biāo)準的方式來獲取不同環(huán)境下的全局 this
對象(也就是全局對象自身)溉苛。不像 window
或者 self
這些屬性,它確迸澹可以在有無窗口的各種環(huán)境下正常工作愚战。所以,你可以安心的使用 globalThis
,不必擔(dān)心它的運行環(huán)境寂玲。為便于記憶塔插,你只需要記住,全局作用域中的 this
就是 globalThis
敢茁。
-
瀏覽器環(huán)境下
console.log(globalThis === window);//true var a = 1; console.log(globalThis.a);//1
-
node環(huán)境下
console.log(globalThis === global);//true var a = 1; globalThis.b = 2; console.log(globalThis.a);//undefined console.log(global.b);//2