js全局变量

本文详细探讨了JavaScript中的核心内置对象,包括值属性、函数属性、构造器属性和其他属性的对象,阐述了它们的基本性质及操作方法。通过实验展示了这些对象在不同浏览器环境中的可重写性,强调了理解JavaScript全局对象对开发者的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里所说的JavaScript指浏览器环境中的包括宿主环境在内的。第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数。

一、核心JavaScript内置对象,即ECMAScript实现提供的不依赖于宿主环境的对象。
这些对象在程序执行之前就已经(实例化)存在了。ECMAScript称为The Global Object,分为以下几种
1, 值属性的全局对象(Value Properties of the Global Object)。有NaN,Infinity,undefined。

2, 函数属性的全局对象(Function Properties of the Global Object)。有eval,parseInt,parseFloat,isNaN,isFinite,decodeURI,encodedURI,encodeURIComponent

3,构造器(类)属性的全局对象(Constructor Properties of the Global Object)。有Object,Function,Array,String,Boolean,Number,Date,RegExp,Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError。

4,其它属性的全局对象(Other Properties of the Global Object),可以看出成是Java中的静态类,可以直接用类名+点号+方法名使用。有Math,JSON。

ECMAScript规范提到这些全局对象(The Global Object)是具有Writable属性的,即Writable为true,枚举性(Enumerable)为false,即不能用for in枚举。ECMAScript有这么一段
Unless otherwise specified, the standard built-in properties of the global object have attributes {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}.

虽然规范提到The Global Object是可以被重写的,但不会有谁去重写它们的。这里仅仅做个测试。

Js代码
1.NaN = 11;
2.eval = 22;
3.Object = 33;
4.Math = 44;
5.
6.alert(NaN);
7.alert(eval);
8.alert(Object);
9.alert(Math);
NaN = 11;
eval = 22;
Object = 33;
Math = 44;

alert(NaN);
alert(eval);
alert(Object);
alert(Math);

分别取值属性的全局对象, 函数属性的全局对象,构造器(类)属性的全局对象,其它属性的全局对象NaN,eval,Object,Math。结果如下:
IE6/7/8 Firefox/Chrome/Opera IE9/Safari
alert(NaN) 11 NaN
alert(eval) 22 22
alert(Object) 33 33
alert(Math) 44 44

结果可以看出除了NaN在IE9(pre3)/Safari不能被重写外,其它都被重写了。

这里只是列举了四个,感兴趣的可以将以上所有的The Global Object一一测试下。这里想表达的是核心JavaScript内置对象一般是可以被重写的 ,虽然没人这么干
内容概要:本文档为《400_IB Specification Vol 2-Release-2.0-Final-2025-07-31.pdf》,主要描述了InfiniBand架构2.0版本的物理层规范。文档详细规定了链路初始化、配置与训练流程,包括但不限于传输序列(TS1、TS2、TS3)、链路去偏斜、波特率、前向纠错(FEC)支持、链路速度协商及扩展速度选项等。此外,还介绍了链路状态机的不同状态(如禁用、轮询、配置等),以及各状态下应遵循的规则和命令。针对不同数据速率(从SDR到XDR)的链路格式化规则也有详细说明,确保数据包格式和控制符号在多条物理通道上的一致性和正确性。文档还涵盖了链路性能监控和错误检测机制。 适用人群:适用于从事网络硬件设计、开发及维护的技术人员,尤其是那些需要深入了解InfiniBand物理层细节的专业人士。 使用场景及目标:① 设计和实现支持多种数据速率和编码方式的InfiniBand设备;② 开发链路初始化和训练算法,确保链路两端设备能够正确配置并优化通信质量;③ 实现链路性能监控和错误检测,提高系统的可靠性和稳定性。 其他说明:本文档属于InfiniBand贸易协会所有,为专有信息,仅供内部参考和技术交流使用。文档内容详尽,对于理解和实施InfiniBand接口具有重要指导意义。读者应结合相关背景资料进行学习,以确保正确理解和应用规范中的各项技术要求。
<think>好的,用户想要了解JavaScript的全局变量。首先,我需要确保自己对这个概念有全面的理解,然后再用清晰的中文解释出来。 首先,全局变量的定义是什么?应该是在任何函数之外声明的变量,或者虽然声明在函数内部但没有使用var、let、const,从而隐式成为全局变量。不过要注意,在严格模式下,隐式声明会报错,这点需要提到。 接下来,全局变量的作用域和生命周期。它们在整个脚本中可用,页面关闭时才销毁。这可能导致内存泄漏,特别是如果滥用的话。需要举例说明,比如在函数内部未使用关键字声明变量,导致意外创建全局变量,这是常见的错误。 然后,全局对象的归属。在浏览器中是window,Node.js中是global。通过给这些对象添加属性也可以创建全局变量,比如window.globalVar = 10。但这种方式可能影响其他脚本,需要注意命名冲突。 优点方面,全局变量确实方便在不同作用域共享数据,但缺点更明显,比如污染全局命名空间,增加耦合度,难以维护。这部分需要强调,避免用户滥用。 最佳实践部分,应该建议尽量避免使用,使用模块模式或IIFE来封装,使用let/const代替var,如果必须使用,可以命名空间化,比如创建一个全局对象来收纳变量。这些建议能帮助用户写出更干净的代码。 安全问题方面,如果全局变量被恶意篡改,可能导致XSS攻击,特别是在处理用户输入时,需要警惕。这部分可能需要更详细的例子,但用户的问题可能不需要深入,所以简单提及即可。 最后,现代模块化方案如ES6模块,可以替代全局变量,这也是重要的点,说明现在有更好的方法避免使用全局变量。 在组织回答时,结构要清晰,分点列出定义、创建方式、注意事项、优缺点、最佳实践和安全问题。确保用例子帮助理解,比如代码片段演示正确和错误的声明方式,以及命名空间的例子。 需要检查是否有遗漏,比如严格模式的影响,隐式声明的注意事项,还有不同环境下的全局对象差异。同时,避免使用Markdown格式,用自然的中文分段落和项目符号,但根据用户要求,可能需要调整格式,不过用户这里的示例用了数字编号和代码块,可能需要按照他们的示例来调整。 现在,把这些点有条理地组织起来,确保符合用户的要求,使用中文,结构清晰,逐步解释,并给出可靠的解决方案和建议。</think>让我们逐步理解JavaScript全局变量的关键知识点: 一、定义与基本特性 1. 全局变量指在`任何函数外部`声明的变量 2. 或未通过`var/let/const`声明直接赋值的变量(非严格模式) 3. 作用范围:整个JavaScript运行时环境 4. 生命周期:从声明开始到页面关闭时销毁 二、两种创建方式示例 ```javascript // 显式全局声明 let globalVar1 = 10; function demo() { // 隐式全局变量(严格模式下会报错) globalVar2 = 20; } ``` 三、核心注意事项 1. 浏览器环境通过`window`对象访问 ```javascript console.log(window.globalVar1); // 输出10 ``` 2. Node.js环境通过`global`对象访问 3. 模块化环境下(如ES6模块)不会自动挂载到全局对象 四、优缺点分析 ✅ 优点: - 跨作用域数据共享 - 快速原型开发时便利 ❌ 缺点: - 命名冲突风险 ```javascript // 不同脚本的同名变量会相互覆盖 let config = {}; // 脚本A let config = []; // 脚本B(覆盖前一个) ``` - 内存泄漏隐患 - 降低代码可维护性 五、最佳实践方案 1. 优先使用IIFE封装 ```javascript (function() { // 局部作用域变量 let privateVar = 42; })(); ``` 2. 使用命名空间模式 ```javascript const MY_APP = { config: {}, utils: {} }; ``` 3. 严格模式约束 ```javascript 'use strict'; function demo() { accidentalGlobal = 5; // 抛出ReferenceError } ``` 4. 模块化开发(ES6标准方案) ```javascript // config.js export const config = {}; // app.js import { config } from './config.js'; ``` 六、安全隐患警示 1. XSS攻击可能通过篡改全局变量实施 2. 避免在全局存储敏感数据 3. 对用户输入赋值全局变量时需严格过滤 建议:现代开发中应尽量减少全局变量使用,通过模块化、闭包等技术实现数据共享。必须使用时建议通过单一命名空间对象进行集中管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值