CN112068816B - 防止js全局污染的方法、存储介质 - Google Patents
防止js全局污染的方法、存储介质 Download PDFInfo
- Publication number
- CN112068816B CN112068816B CN202010711577.9A CN202010711577A CN112068816B CN 112068816 B CN112068816 B CN 112068816B CN 202010711577 A CN202010711577 A CN 202010711577A CN 112068816 B CN112068816 B CN 112068816B
- Authority
- CN
- China
- Prior art keywords
- file
- global
- external
- function
- closure
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 25
- 238000004590 computer program Methods 0.000 claims description 5
- 230000006870 function Effects 0.000 description 60
- 241001494479 Pecora Species 0.000 description 7
- 230000009286 beneficial effect Effects 0.000 description 3
- 238000010367 cloning Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000010076 replication Effects 0.000 description 1
- 210000002268 wool Anatomy 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供防止JS全局污染的方法、存储介质,方法包括:加载一外部js文件,并将其转换为字符串;创建与所述一外部js文件对应的代理对象,并将全局对象的所有属性复制到所述代理对象中;将所述一外部js文件对应的字符串和代理对象作为参数传递给动态编译函数;将全局对象的名称作为闭包函数的变量名称,将所述代理对象作为闭包函数的变量内容,将所述字符串作为闭包函数闭包的参数,设置到所述动态编译函数中的闭包函数中。本发明能够确保外部js的加载不会产生全局污染,进而提高程序稳定性。
Description
技术领域
本发明涉及web应用开发,具体涉及防止JS全局污染的方法、存储介质。
背景技术
javascript语言的灵活特性,一方面极大提升了web应用的开发效率,同时也带来了很多问题,其中一个令人头疼的就是全局污染问题。比如当前应用加载了一个工具或者模块,然后这个工具或者模块的js代码,对全局变量window.A进行了修改,如果这个全局变量window.A刚好也是其他模块要用到的,那就会产生程序错误。
因此,本发明目的在于提供一种确保加载一个js代码的时候,不会产生全局污染的技术方案。
发明内容
本发明所要解决的技术问题是:提供防止JS全局污染的方法、存储介质,确保加载js代码后不会造成全局污染,从而提高程序稳定性。
为了解决上述技术问题,本发明采用的技术方案为:
防止JS全局污染的方法,包括:
加载一外部js文件,并将其转换为字符串;
创建与所述一外部js文件对应的代理对象,并将全局对象的所有属性复制到所述代理对象中;
将所述一外部js文件对应的字符串和代理对象作为参数传递给动态编译函数;
将全局对象的名称作为闭包函数的变量名称,将所述代理对象作为闭包函数的变量内容,将所述字符串作为闭包函数闭包的参数,设置到所述动态编译函数中的闭包函数中。
本发明提供的另一个技术方案为:
一种计算机可读存储介质,其上存储有计算机程序,所述程序在被一个或多个处理器执行时,能够实现上述防止JS全局污染的方法所包含的步骤。
本发明的有益效果在于:本发明通过设置与js文件对应的代理对象,并将全局对象的所有属性都“复制”过来,从而“克隆”出一个与js文件对应的“全局对象”;通过动态编译函数以字符串的js文件和代理对象为参数,利用其内的闭包函数将js文件对应“全局变量”的操作均转移为由代理对象接管,而不会对全局变量做任何修改,因此能够确保外部js的加载不会产生全局污染,进而提高程序稳定性。
附图说明
图1为本发明一实施例一种防止JS全局污染的方法的流程示意图;
图2为本发明实施例一的防止JS全局污染的方法的流程示意图。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
本发明最关键的构思在于:通过代理对象“克隆”一个与js文件对应的“全局变量”,并通过动态编译函数内设置的闭包函数将js文件对应“全局变量”的操作均转移为由代理对象接管,而不会对全局变量做任何修改。
本发明涉及的技术术语解释:
请参照图1,本发明提供防止JS全局污染的方法,包括:
加载一外部js文件,并将其转换为字符串;
创建与所述一外部js文件对应的代理对象,并将全局对象的所有属性复制到所述代理对象中;
将所述一外部js文件对应的字符串和代理对象作为参数传递给动态编译函数;
将全局对象的名称作为闭包函数的变量名称,将所述代理对象作为闭包函数的变量内容,将所述字符串作为闭包函数闭包的参数,设置到所述动态编译函数中的闭包函数中。
从上述描述可知,本发明的有益效果在于:通过代理的方式,给新加载的js代码一个代理全局对象供其操作,从而避免对“真正”的全局变量进行更改而造成全局污染。
进一步地,还包括:
执行所述动态编译函数后,所述闭包函数闭包的参数对应所述全局对象的操作将被参数代理对象所代理。
由上述描述可知,动态编译函数启动后,将能够确保js文件不对全局对象做任何修改,而依然能够成功完成js文件的加载和执行。
进一步地,还包括:
加载另一外部js文件后,创建与所述另一外部js文件对应的代理对象。
由上述描述可知,对应每个外部js文件都创建一个与之唯一对应的代理对象来代理对全局变量的操作,能够实现隔离各个js文件对全局变量的操作,禁止每一个js文件真正改变全局变量。
进一步地,所述加载一外部js文件,并将其转换为字符串,包括:
使用fatch对象加载一外部js文件;
若加载失败,则结束;
若加载成功,则转换所述一外部js文件为字符串。
由上述描述可知,对js文件加载是否成功进行判断,加载成功再执行后续步骤,否则结束流程,能够及时止损,确保后续步骤有意义的执行。
本发明提供的另一个技术方案为:
一种计算机可读存储介质,其上存储有计算机程序,所述程序在被一个或多个处理器执行时,能够实现下述防止JS全局污染的方法所包含的步骤:
加载一外部js文件,并将其转换为字符串;
创建与所述一外部js文件对应的代理对象,并将全局对象的所有属性复制到所述代理对象中;
将所述一外部js文件对应的字符串和代理对象作为参数传递给动态编译函数;
将全局对象的名称作为闭包函数的变量名称,将所述代理对象作为闭包函数的变量内容,将所述字符串作为闭包函数闭包的参数,设置到所述动态编译函数中的闭包函数中;
将所述代理对象传递给闭包函数的变量。
进一步地,还包括:
执行所述动态编译函数后,所述闭包函数闭包的参数对应所述全局对象的操作将被参数代理对象所代理。
进一步地,还包括:
加载另一外部js文件后,创建与所述另一外部js文件对应的代理对象。
进一步地,所述加载一外部js文件,并将其转换为字符串,包括:
使用fatch对象加载一外部js文件;
若加载失败,则结束;
若加载成功,则转换所述一外部js文件为字符串。
从上述描述可知,对应本领域普通技术人员可以理解实现上述技术方案中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来实现的,所述的程序可存储于一计算机可读取的存储介质中,该程序在执行时,可包括如上述各方法的流程。所述程序在被处理器执行后,同样能够实现对应各方法的有益效果。
其中,所述的存储介质可以是磁盘、光碟、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
实施例一
请参照图2,本实施例提供一种防止JS全局污染的方法,包括:
S1:使用atch对象加载一外部js文件;
若加载失败,则结束流程;
若加载成功,则将所加载的外部js文件转换为对应的字符串,并执行步骤S2;
S2:创建一个与所加载外部js文件对应的代理对象,取名proxy;
S3:将全局对象window的所有属性全部复制到所述代理对象proxy中;
此时,代理对象proxy将拥有和全局对象window一样的功能,但实际上它们是两个独立的对象。这里的“复制”其实可以理解为克隆。可以这样理解:依据一只名字叫做window的小羊,克隆出另一只名字叫做proxy的小羊,虽然这两只羊长得是一样,内结构也一模一样,甚至技能也是一模一样,但是它们却是两只独立的羊,如果把小羊proxy的毛剪掉,并不会对window的毛产生影响,所以它们又是独立的。
S4:创建一个动态编译函数,取名execScript;该动态编译函数负责对S1所加载的js代码进行编译。
S5:将外部js文件对应的字符串和对应的代理对象proxy分别作为参数传递给动态编译函数;
S6:在动态编译函数中创建一闭包函数;
S7:将全局对象的名称window作为闭包函数的变量,将动态编译函数接收的参数“代理对象”作为闭包函数的变量内容,将动态编译函数接收的参数“字符串”作为闭包函数闭包的参数,设置到动态编译函数中创建的闭包函数中。
在此,利用闭包函数的变量名称与全局对象window同名,但实际内容对应代理对象proxy,从而达到欺骗闭包内代码的目的,因为闭包参数的优先级高于全局变量,因此闭包内如果出现window.xxx之类的代码时,即对应“window”的操作时,访问的将不再是全局对象的window,取而代之的是闭包参数的window,即代理对象proxy。
S8:执行所述动态编译函数。
执行后,所述闭包函数闭包的参数(即js文件)对应所述全局对象的操作将均被代理对象proxy所代理。
后续,若再成功加载另一外部js文件,则重新创建一个与该新加载的外部js文件相对应的代理对象,并对动态编译函数所接收的参数进行相应修改后,执行S3-S8步骤。
在一具体实例中,动态编译函数的内容如下所示:
下面,对上述动态编译函数进行解释:
上述标号1的代码,表示动态编译函数execScript接收两个参数:jsCode(字符串格式的js代码)和proxy(代理对象);
上述标号(3)的代码,表示创建一个动态闭包函数,它接收一个命名为window的参数;
上述标号(4)的代码,其中的${jsCode}代码块会被替换为动态编译函数execScript接收的第一个参数“jsCode”的具体内容;
上述标号(5)的代码,表示将动态编译函数execScript接收的第二个参数“proxy”传递给闭包参数window。在此,结合上述标号(3)的设置,将能够欺骗闭包内代码,结合闭包参数优先级高于全局变量的特性,在闭包内将对名称为window的访问需求(即实际对应全局变量的访问需求)都转移到对名称同样为window,但实际内容已经被替换为“proxy”的内容的访问。
上述标号(2)的代码,标识动态编译标号为(3)-(5)的代码。
另外,执行动态编译函数后,传入的第一个参数是字符串格式的js代码,第二个参数是代理对象proxy。
实施例二
本实施例对应实施例一,提供一具体运用场景:
假设有一个js文件:a.js,将其转换为字符串后,内容为:“
window.globalVar=’这个是代理过的全局对象’
console.log(window.globalVar)
”
上述代码的第一行表示在全局对象window中新建一个属性globalVar,用于存储字符串“这个是代理过的全局对象”;
第二行表示将window.globalVar打印在控制台中。
按照实施例一的技术方案执行后,控制台依然能够打印出“这个是代理过的全局对象”的内容,而全局对象window中,并不会“新建属性globalVar,即不会对全局对象window进行操作。
以下对本实施例的动态编译函数的执行结果进行详细描述:
将上述“a.js”的内容做为第一个参数,将对应创建的代理对象proxy作为第二个参数,传递给动态编译函数;
动态编译函数中闭包函数闭包的参数将被替换为转换为字符串的“a.js”内容,以下为替换后在内存中的表示:
上述动态编译函数的“eval”被执行后,上述标号3的“window.globalVar”中的window实际上是动态编译函数中闭包函数的参数“(function(window)”中的window,其实际对应的是代理对象已经不再是真正的全局对象。
而上述标号(2)中闭包的参数window,来源为execScript的标号(5)中传入的代理对象proxy,也就是execScript的第二个参数。
所以,在a.js文件中任何对全局对象window的修改,都会被代理对象proxy接管,并不会真正的修改到全局的window。
同理可证,如果这个时候同样有一个b.js文件被成功载入,也会有一个新的代理对象proxy来接管其对全局对象window的操作;即使a.js和b.js中都有对window.globalVar的修改,也不会冲突,因为它们分别对应两个不同的proxy。
实施例三
本实施例对应实施例一和实施例二,提供一种计算机可读存储介质,其上存储有计算机程序,所述程序在被一个或多个处理器执行时,能够实现上述实施例一或实施例二所述的防止JS全局污染的方法所包含的步骤。具体的步骤内容在此不进行复述,详情请参阅实施例一或实施例二的记载。
综上所述,本发明提供的防止JS全局污染的方法、存储介质,能够确保加载js代码后不会造成全局污染,从而提高程序稳定性;并且,还具有实施方便简便、易行,实用性强、成本低等优点。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (3)
1.防止JS全局污染的方法,其特征在于,包括:
加载一外部js文件,并将其转换为字符串;
创建与所述一外部js文件对应的代理对象,并将全局对象的所有属性复制到所述代理对象中;
将所述一外部js文件对应的字符串和代理对象作为参数传递给动态编译函数;
将全局对象的名称作为闭包函数的变量名称,将所述代理对象作为闭包函数的变量内容,闭包参数的优先级高于全局变量;将所述字符串作为闭包函数闭包的参数,设置到所述动态编译函数中的闭包函数中;
执行所述动态编译函数后,所述闭包函数闭包的参数对应所述全局对象的操作将被参数代理对象所代理;
加载另一外部js文件后,创建与所述另一外部js文件对应的代理对象。
2.如权利要求1所述的防止JS全局污染的方法,其特征在于,所述加载一外部js文件,并将其转换为字符串,包括:
使用fetch对象加载一外部js文件;
若加载失败,则结束;
若加载成功,则转换所述一外部js文件为字符串。
3.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述程序在被一个或多个处理器执行时,能够实现上述权利要求1或2所述的防止JS全局污染的方法所包含的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010711577.9A CN112068816B (zh) | 2020-07-22 | 2020-07-22 | 防止js全局污染的方法、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010711577.9A CN112068816B (zh) | 2020-07-22 | 2020-07-22 | 防止js全局污染的方法、存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112068816A CN112068816A (zh) | 2020-12-11 |
CN112068816B true CN112068816B (zh) | 2023-11-10 |
Family
ID=73657411
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010711577.9A Active CN112068816B (zh) | 2020-07-22 | 2020-07-22 | 防止js全局污染的方法、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112068816B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9015682B1 (en) * | 2012-03-28 | 2015-04-21 | Google Inc. | Computer code transformations to create synthetic global scopes |
CN109388770A (zh) * | 2018-09-17 | 2019-02-26 | 北京市计算中心 | Web页面生成方法及装置 |
CN110045958A (zh) * | 2019-04-17 | 2019-07-23 | 腾讯科技(深圳)有限公司 | 纹理数据生成方法、装置、存储介质及设备 |
CN110941429A (zh) * | 2019-10-23 | 2020-03-31 | 东软集团股份有限公司 | 一种网页的业务脚本处理方法、装置及设备 |
-
2020
- 2020-07-22 CN CN202010711577.9A patent/CN112068816B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9015682B1 (en) * | 2012-03-28 | 2015-04-21 | Google Inc. | Computer code transformations to create synthetic global scopes |
CN109388770A (zh) * | 2018-09-17 | 2019-02-26 | 北京市计算中心 | Web页面生成方法及装置 |
CN110045958A (zh) * | 2019-04-17 | 2019-07-23 | 腾讯科技(深圳)有限公司 | 纹理数据生成方法、装置、存储介质及设备 |
CN110941429A (zh) * | 2019-10-23 | 2020-03-31 | 东软集团股份有限公司 | 一种网页的业务脚本处理方法、装置及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN112068816A (zh) | 2020-12-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9942307B2 (en) | Web application script migration | |
CN106547527B (zh) | 一种JavaScript文件构建方法及装置 | |
US9292271B2 (en) | Apparatus and method for managing software translation | |
IE20030061A1 (en) | Document transformation | |
CN111831384A (zh) | 语言切换方法和装置、设备及存储介质 | |
US20070271550A1 (en) | System and method for extensible java server page resource management | |
US8615729B2 (en) | Extending existing model-to-model transformations | |
CN113031932A (zh) | 项目开发方法、装置、电子设备及存储介质 | |
JP7409197B2 (ja) | ソフトウェアプログラムにおける静的分析違反の修復パターンの精緻化 | |
US9207956B2 (en) | Class loading device for a java runtime environment, cluster system and method of executing a function | |
US9244706B2 (en) | Command line shell command generation based on schema | |
CN110187886B (zh) | 一种文档网站生成方法及终端 | |
US6339839B1 (en) | Enabling multiple code generators in a translator-based embedded scripting system | |
CN111310005A (zh) | 网络请求的处理方法及装置、服务器和存储介质 | |
CN110362317B (zh) | 一种代码转换方法、装置和存储介质 | |
CN112068816B (zh) | 防止js全局污染的方法、存储介质 | |
CN111596970B (zh) | 动态库延迟加载方法、装置、设备和存储介质 | |
CN111984300A (zh) | 代码复制方法及装置、电子设备和计算机可读存储介质 | |
CN117008920A (zh) | 引擎系统、请求处理方法、装置、计算机设备及存储介质 | |
CN114168151B (zh) | 基于容器的程序编译方法、装置、电子设备及存储介质 | |
CN106293862A (zh) | 一种可扩展标记语言xml数据的解析方法和装置 | |
CN111831288B (zh) | 一种自动生成Thrift IDL数据结构及自动转换函数的方法及系统 | |
CN111399931B (zh) | 一种LayaAir引擎导出UI资源的方法及终端 | |
CN112650502A (zh) | 批处理任务处理方法、装置、计算机设备和存储介质 | |
CN112988260B (zh) | 应用冷启动优化方法、装置、计算机设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |