javascirpt中window和global的联系

1 js中global对象的含义是什么?它是否真实存在? 

 

2 为什么js中的全局对象是window? 是怎么实现的? 

 

首先看第一个问题,直接在网页中alert(global); 是会出错的,所以这个global对象其实是不存在的,global是一个抽象的概念,代表js中的全局对象,在web中js 的全局对象表现为window. 所以说global是个抽象的概念,而在web中window就是对global的实现,window是可以直接访问的,它是真实存在的,而global是虚拟的,不存在的. 

 

关于第二个问题,为什么js中会有window这个全局变量呢? js只是一种脚本,它所有的意义都是解析器赋与的.所以我们得看解析器是怎么解析window的. 与js对象定义的位置划分js对象可以划分为外部定义对象与内置对象,外部定义对象指的是在js代码中定义的,而内置对象是指在js解析器内部定义的. 在chromium中定义内置对象定义有两种方法,一种是直接在v8引擎中定义,一种是通过v8引擎的扩展文件.idl调用到对应的c++对象,所有的内置js对象都有一个c++对象与之对象. Window js对象是通过widnow.idl中定义的,它的源码在webkitsource/core/frame中.  首先看 window.idl 中定义开头的地方: 

[

    CheckSecurity=Receiver,

    ImplementedAs=DOMWindow,

    PrimaryGlobal,

 

ImplementedAs 指定了它的实现 c++类, PrimaryGlobal 指定了window对象是全局的对象,.idl是chromium 中实现扩展js一种机制,简单的说它就是js和c++对象串联起来的一座桥梁,搞清楚.idl机制对于理解内置js对象在webkit中的实现是非常重要的,关于idl详细规则可以参考chromium工程的官方网站(http://www.chromium.org/developers/design-documents/idl-compiler 可能需要梯子) ,它会由python解析成对应的V8window 类,然后v8window的类调用到了继承于DOMWindow的LocalDomWindow.  在js中所有的属性和方法都是源自于window的,所以可以在window.idl 中发现其它所有的 window属性和方法. 

### JavaScript 中将 `window` 设置为全局对象 在浏览器环境中,`Window.window` 属性本身即是全局对象[^1]。这意味着可以直接通过 `window` 来访问所有的全局变量函数。如果需要显式地将某个对象设置为全局对象,则可以通过覆盖默认的 `window` 对象实现。 以下是具体的操作方式: #### 方法 1:直接赋值 可以简单地将目标对象赋值给 `window`,从而使其成为新的全局对象的一部分: ```javascript const customGlobalObject = { myProperty: 'This is a global property', myFunction: function() { console.log('This is a global function'); } }; // 将自定义对象挂载到 window 上 for (let key in customGlobalObject) { if (customGlobalObject.hasOwnProperty(key)) { window[key] = customGlobalObject[key]; } } ``` 这样操作之后,`myProperty` `myFunction` 都会变成全局可访问的对象或方法。 #### 方法 2:使用 `defineProperty` 为了更精确地控制全局对象的行为,还可以利用 `Object.defineProperty()` 定义具有特定行为的属性。例如,在设置某些特殊逻辑时非常有用[^4]: ```javascript Object.defineProperty(window, 'globalVar', { value: 'I am globally defined!', writable: true, configurable: true, enumerable: true }); console.log(globalVar); // 输出 "I am globally defined!" ``` 需要注意的是,虽然能够修改 `window` 的内容以扩展其功能或者模拟其他环境下的全局作用域,但在实际开发过程中应当谨慎对待这种做法,因为这可能会引起命名冲突以及难以维护等问题。 另外值得注意的一点是关于定时器 API 如 `setTimeout`,它也是绑定于 `window` 下的一个重要成员[^5],因此当我们调整整个窗口上下文的时候也需要考虑到这些内置机制是否会受到影响。 综上所述,尽管技术上可行去改变现有的 Window 实例作为我们自己的 Global Object 使用,但从最佳实践角度来看并不推荐这样做除非有特别需求场景支持这么做才行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值