想要了解window对象,需要先了解ECMA-262定义的内置对象Global。
什么是内置对象?
ECMA-262对内置对象的定义是"由ECMAScript实现提供 与宿主环境无关,并且在ECMAScript程序开始执行时就存在的对象." (开发者不需要显式地实例化内置对象,他们已经实例化好了 类似于开箱即用)
Global对象
代码不会显式地访问Global对象. ECMA-262规定Global对象为一种兜底对象,它所针对的是 不属于任何对象的属性和方法.( 如 isNaN() isFinite() parseInt() parseFloat()这些函数在Global对象中 属于全局函数 可以直接使用 无需程序员定义 )
在全局作用域定义的变量和函数,都会成为Global对象的属性.
- Global对象上 还有另外的一些方法
1. URL编码方法 encodeURI() 和 encodeURIComponent() 方法用于 编码统一资源标识符URI (可以理解为资源的身份证号)
2.eval()方法 它是一个完整的ECMASript解释器.它接收一个参数,即一个要执行的JS字符串.
eval("console.log('hi')");
// 上面代码功能和下面一行等价
console.log('hi');
- Global对象属性
Global对象有很多属性, 像 undefind NaN Infinity等特殊值,都是Global对象的属性。 所有原生引用类型的构造函数 如Object Function也都是Global对象的属性。(所以这些特殊值和构造函数都可以直接用如 new Object())
window对象: 虽然ECMA-262没有规定 直接访问Global对象的方式,但浏览器将window对象实现为Global对象的代理. 因此所有全局作用域中 声明的变量和函数都成为了window的属性.
var color = "red";
function sayColor(){
console.log( window.color );
}
window.sayColor();//red
什么时候可以省略window,什么时候建议些上?
在 JavaScript 中,window 对象是浏览器提供的全局对象,代表浏览器的窗口。它包含了许多全局属性和方法,例如 alert()、setTimeout()、location 等。同时,浏览器将window对象实现为Global对象的代理. 因此所有全局作用域中 声明的变量和函数都成为了window的属性.
1. 什么时候可以省略 window
当使用 window 对象的属性和方法时,如果这些属性或方法是全局变量或函数,那么可以省略 window。
常见例子:
// 直接调用 alert 和 setTimeout,这时 window 可以省略
alert("Hello, world!"); // 等同于 window.alert("Hello, world!");
setTimeout(() => {
console.log("1秒后执行");
}, 1000); // 等同于 window.setTimeout
console.log(location.href); // 等同于 window.location.href
原理:
• window 对象的属性和方法会自动作为全局对象的一部分加入到 JavaScript 执行环境中,因此可以直接使用。
2. 什么时候推荐使用 window 显式调用
最佳实践:如果不确定是否存在同名冲突,或者在代码可读性上想要明确,建议使用 window 显式调用属性和方法。
var myBtn = document.getElementById('btn');
myBtn.addEventListener('click',function(){
//当前页面中打开
window.open("https://habitica.com/","_self");
})