警惕javascript变量的全局污染

作用域的概念总是和变量形影不离,它不是javascript语言独有的概念,只是其运用上与其他大型语言略有不同,JavaScript语言中采用的是弱类型的变量类型,对使用的数据类型未做出严格的要求,是基于Java基本语句和控制的脚本语言,其设计简单紧凑。

JavaScript对作用域的运用与其他语言略有不同,然而总体概念是一致的。作用域限定了javascript文档中的各个资源的可用范围,决定了你定义变量的位置。使用一个匿名函数来容纳所需的变量就是个很好的方法。所有在函数中定义的变量都只应该在该函数的作用域内生效。(变量的作用域会自动向下延伸,这是闭包的概念)

再声明全局作用域的变量,无论何时都能被所有函数所使用,这是个非常诱人的特性,但是对全局作用域的过度使用会造成全局作用域污染,这倒是我们用光所有的合适的变量名,也会导致长久占用内存空间,从而很难创建出一个能够长久维护的应用来。所以,对全局作用域的使用一定要少而谨慎。

比如,以下的全局污染示例:

 1 //全局作用域污染
 2 varpartyStarter="starlen";
 3
 4 functionpizzaParty(totalSlices,peopleCount){
 5 "usestrict";
 6
 7 varfairness=totalSlices*peopleCount;
 8 returnfairness;
 9 }
10
11 (function(){
12 "usestrict";
13
14 varbody=document.getElementsByTagName("body")[0];
15
16 body.innerHTML="‘<p>‘‘<ahref=‘*‘>‘partyStarty(26,18)‘</a>‘+partyStarter+‘</p>‘";
17 })();

全局变量与任何编程语言中的其他东西一样,也有其用途。然而对他的使用尤需谨慎,而且在用之前必须仔细的思量其内容及名称。使用全局变量来设定程序的全局配置数据是个比较好的办法,全局配置包括:基地址(base URL)、目录信息、程序名称,或是一些需要反复使用而重复定义又会造成资源浪费的东西,应该利用每一件东西的长处,而不应该滥用。

现在,我将这个变量移动到了匿名函数之中,以清理该文档的全局作用域。合适的位置看起来也更加顺眼,并且在该函数执行完毕时会立即销毁变量,不会占用内存的宝贵资源。

 1 Function  pizzaParty(totalSlices,peopleCount){
 2 "usestrict";
 3
 4 Var fairness=totalSlices*peopleCount;
 5 Return fairness;
 6 }
 7
 8 (function(){
 9 "usestrict";
10
11 varbody=document.getElementsByTagName("body")[0];
12 varpartyStarter="starlen";
13
14 body.innerHTML="‘<p>‘‘<ahref=‘*‘>‘partyStarty(26,18)‘</a>‘+partyStarter+‘</p>‘";
15 })();
时间: 2024-07-30 13:56:52

警惕javascript变量的全局污染的相关文章

javascript变量:全局?还是局部?这个得注意!

做项目就是一个学习的过程! 做为一个学习C3年多,从C程序员转前端的人来说,javascript中的许多规则是没办法或者说一时半会理解不了的. 今天就遇到了一个,大致就是这么个代码. var a ; //全局变量 function fun() { alert(a); // a 在其它地方赋值,在这里操作,比如赋值为 0 ------------- 1 if(a==0) { alert(a); // ----------------2 a = 10; } var a = 5 ; // 重新定义变量

javascript变量:全局?还是局部?这个得注意

在JS中,是没有块级作用域的 举两个个例子: if语句块: if (true){ var name='Ling'; } alert(name); 输出:Ling for语句块; for(var i=0;i<10;i++) { var name='Ling'; } alert(i); alert(name); 输出:10 输出:Ling 也就是说最后的结果都是window下全局变量: <span style="font-family:KaiTi_GB2312;">ale

javascript防止变量全局污染

前段时间封装了一个函数,当时考虑的没那么多,最近回头看这个封装的函数时发现其实造成了全局污染.原先的函数是这样的: function interval(fn, ms){ !this.fn?(this.fn = fn,this.ms = ms,this.step = 0):null this.step++ this.step%(this.ms * 60) == 0?this.fn():null requestAnimationFrame(interval) } interval(() => { c

说说javascript变量类型和变量类型检测

javascript是一种弱类型语言,它的典型例子就是即变量在使用的时候可以给它赋值任何类型.那么先来看下javascript都有那些变量类型已经它们的使用方法吧. 先来看看javascript都有那些类型吧: string --- 字符串number --- 数值boolean --- 布尔值undefined --- 未申明的变量 或 申明并未赋值null --- 空object  --- 对象function  --- 函数 这里比较有争议的是 function 类型到底要不要归属到变量类

读书笔记——javascript变量作用域

<JavaScript权威指南>第6版第三章第10节: 一个变量的作用域(scope)是程序源代码中定义这个变量的区域.全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的.然而在函数内声明的变量只在函数体内有定义.它们是局部变量,作用域也是局部的.函数参数也是局部变量,它们只在函数体内有定义.   在函数体内,局部变量的优先级高于同名的全局变量.如果在函数内声明的一个局部变量或函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖. var scope = 

2015第35周五JavaScript变量

java语言里有一句很经典的话:在java的世界里,一切皆是对象. Javascript虽然跟java没有半点毛关系,但是很多会使用javascript的朋友同样认为:在javascript的世界里,一切也皆是对象. 其实javascript语言和java语言一样变量是分为两种类型:基本数据类型和引用类型. 基本类型是指:Undefined.Null.Boolean.Number和String:而引用类型是指多个指构成的对象,所以javascript的对象指的是引用类型.在java里能说一切是对

第一天:javascript变量与表达式(2)

本系列内容为本人平时项目实践和参照MDN,MSDN,<javascript语言精粹>,<Effective Javascript>等资料,并且整理自己EverNote的日常积累整理所写,时间太长有一些代码样例来源不可考.本系列不允许任何形式的转载,谢谢. from yeanzhi 大纲 第一天:javascript变量,操作符与变量作用域 第二天:javascript函数 第三天:对象与原型 第四天:再谈函数与继承 第五天:内置对象 第六天:特殊性质与技巧 第一天:javascri

JavaScript变量作用域

全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返回的将是局部变量的值. 例如: var scope="我是全局变量"; function checkscope(){ var scope="我是局部变量"; console.log(scope); } checkscope(); 输出:我是局部变量 这里需要注意的是,在

javascript变量声明带var和不带var的区别

javascript变量声明带var和不带var的区别:在javascript中,声明变量可以使用var也可以不用使用var,下面就介绍一下这两者的区别.一.作用域的区别:不使用var声明的变量的作用域是全局性的,无论是否声明在函数的内部.使用var声明的变量的时候,如果是在函数外部声明的那么就是全局性的,在函数内部声明的就是局部变量.代码实例: <script type="text/javascript"> var a; function fun() { var b; c