Javascript中关于内存泄漏问题(转)

引用自:http://www.pcjx.com/webde/Javascript/209175.html

[b]常规循环引用内存泄漏和Closure内存泄漏[/b]

要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理。

我记得原来在犀牛书《JavaScript: The Definitive Guide》中看到过,IE使用的GC算法是计数器,因此只碰到循环 引用就会造成memory leakage。后来一直觉得和观察到的现象很不一致,直到看到Eric的文章,才明白犀牛书的说法没有说得很明确,估计该书成文后IE升级过算法吧。在 IE 6中,对于javascript object内部,jscript使用的是mark-and-sweep算法,而对于javascript object与外部object(包括native object和vbscript object等等)的引用时,IE 6使用的才是计数器的算法。

Eric Lippert在http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx一文中提到IE 6中JScript的GC算法使用的是nongeneration mark-and-sweep。对于javascript对算法的实现缺陷,文章如是说:

"The benefits of this approach are numerous, but the principle benefit is that circular references are not leaked unless the circular reference involves an object not owned by JScript. "

也就是说,IE 6对于纯粹的Script Objects间的Circular References是可以正确处理的,可惜它处理不了的是JScript与Native Object(例如Dom、ActiveX Object)之间的Circular References。

所以,当我们出现Native对象(例如Dom、ActiveX Object)与Javascript对象间的循环引用时,内存泄露的问题就出现了。当然,这个bug在IE 7中已经被修复了[http://www.quirksmode.org/blog/archives/2006/04 /ie_7_and_javasc.html]。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp 中有个示意图和简单的例子体现了这个问题:



上面这个例子,看似很简单就能够解决内存泄露的问题。可惜的是,当我们的代码中的结构复杂了以后,造成循环引用的原因开始变得多样,我们就没法那么容易观察到了,这时候,我们必须对代码进行仔细的检查。

尤其是当碰到Closure,当我们往Native对象(例如Dom对象、ActiveX Object)上绑定事件响应代码时,一个不小心,我们就会制造出Closure Memory Leak。其关键原因,其实和前者是一样的,也是一个跨javascript object和native object的循环引用。只是代码更为隐蔽,这个隐蔽性,是由于javascript的语言特性造成的。但在使用类似内嵌函数的时候,内嵌的函数有拥有一个reference指向外部函数的scope,包括外部函数的参数,因此也就很容易造成一个很隐蔽的循环引用,例如:

DOM_Node.onevent ->function_object.[ [ scope ] ] ->scope_chain ->Activation_object.nodeRef ->DOM_Node。

[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp]有个例子极深刻地显示了该隐蔽性:

还有这个例子在IE 6中同样原因会引起泄露

关于Closure的知识,大家可以看看 这篇文章 ,习惯中文也可以看看zkjbeyond的blog,他对Closure 这篇文章进行了简要的翻译。之所以会有这一系列的问题,关键就在于javascript是种函数式脚本解析语言,因此javascript中“函数中的变量的作用域是定义作用域,而不是动态作用域”,这点在犀牛书《JavaScript: The Definitive Guide》中的“Funtion”一章中有所讨论。

http://support.microsoft.com/default.aspx?scid=KB;EN-US;830555中也对这个问题举了很详细的例子。

一些简单的解决方案

目前大多数ajax前端的javascript framework都利用对事件的管理,解决了该问题。

如果你需要自己解决这个问题,可以参考以下的一些方法:

http://outofhanwell.com/ieleak/index.php?title=Main_Page:有个不错的检测工具

http://youngpup.net/2005/0221010713 中提到:可以利用递归Dom树,解除event绑定,从而解除循环引用:

而http://novemberborn.net/javascript/event-cache一文中则通过增加EventCache,从而给出一个相对结构化的解决方案

使用方法也很简单:

http://talideon.com/weblog/2005/03/js-memory-leaks.cfm 一文中的方法类似:


* @param fn Handler function.
* @param useCapture Use event capture. False by default.
* If you don't understand this, ignore it.
*
* @return True if handler registered, else false.
*/
Add: function(obj, type, fn, useCapture){
this.Initialise();
// If a string was passed in, it's an id.
if(typeof obj=="string"){
obj = document.getElementById(obj);
}
if(obj==null || fn==null){
return false ;
}
// Mozilla/W3C listeners?
if(obj.addEventListener){
obj.addEventListener(type, fn, useCapture);
this._registry.push({obj: obj, type: type, fn: fn, useCapture: useCapture});
return true ;
}
// IE-style listeners?
if(obj.attachEvent && obj.attachEvent("on" + type,fn)){
this._registry.push({obj: obj, type: type, fn: fn, useCapture: false });
return true ;
}
return false ;
},
/* *
* Cleans up all the registered event handlers.
*/
CleanUp: function(){
for(var i=0;i<EventManager._registry.length;i++){
with(EventManager._registry[i]) {
// Mozilla/W3C listeners?
if(obj.removeEventListener) {
obj.removeEventListener(type, fn, useCapture);
}
else if(obj.detachEvent){// IE-style listeners?
obj.detachEvent("on"+type,fn);
}
}
}
// Kill off the registry itself to get rid of the last remaining
// references.
EventManager._registry = null ;
}
};

使用起来也很简单:

google map api同样提供了一个类似的函数用在页面的unload事件中,解决Closure带来的内存泄露问题。

当然,如果你不嫌麻烦,你也可以为每个和native object有关的就阿vascript object编写一个destoryMemory函数,用来手动调用,从而手动解除Dom对象的事件绑定。

还有一种就是不要那么OO,抛弃Dom的一些特性,用innerHTML代替appendChild,避开循环引用。详细见http://birdshome.cnblogs.com/archive/2005/02/16/104967.html中的讨论贴。

Cross-Page Leaks

Cross-Page Leaks和下一节提到的Pseudo-Leaks在我看来,就是IE的bug,虽然MS死皮赖脸不承认

大家可以看看这段例子代码:


parentDiv = null ;
childDiv = null ;
}
hostElement = null ;
}
// 而这个函数不会引发Cross-Page Leaks
function CleanMemory()
{
var hostElement = document.getElementById("hostElement");
// Do it a lot, look at Task Manager for memory response
for (i=0;i<5000;i++)
{
var parentDiv = document.createElement("<div onClick='foo()'>");
var childDiv = document.createElement("<div onClick='foo()'>");
// Changing the order is important, this won't leak
hostElement.appendChild(parentDiv);
parentDiv.appendChild(childDiv);
hostElement.removeChild(parentDiv);
parentDiv.removeChild(childDiv);
parentDiv = null ;
childDiv = null ;
}
hostElement = null ;
}
</script>
</head>
<body>
<button onclick="LeakMemory()"> Memory Leaking Insert </button>
<button onclick="CleanMemory()" > Clean Insert </button>
<div id="hostElement"></ div >
</body>
</html>

LeakMemory和CleanMemory这两段函数的唯一区别就在于他们的代码的循序,从代码上看,两段代码的逻辑都没有错。

但LeakMemory却会造成泄露。原因是LeakMemory()会先建立起parentDiv和childDiv之间的连接,这时候,为了让 childDiv能够获知parentDiv的信息,因此IE需要先建立一个临时的scope对象。而后parentDiv建立了和 hostElement对象的联系,parentDiv和childDiv直接使用页面document的scope。可惜的是,IE不会释放刚才那个临时的scope对象的内存空间,直到我们跳转页面,这块空间才能被释放。而CleanMemory函数不同,他先把parentDiv和 hostElement建立联系,而后再把childDiv和parentDiv建立联系,这个过程不需要单独建立临时的scope,只要直接使用页面 document的scope就可以了, 所以也就不会造成内存泄露了

详细原因,大家可以看看http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp这篇文章。

IE 6中垃圾回收算法,就是从那些直接"in scope"的对象开始进行mark清除的:

Every variable which is "in scope" is called a "scavenger". A scavenger may refer to a number, an object, a string, whatever. We maintain a list of scavengers – variables are moved on to the scav list when they come into scope and off the scav list when they go out of scope.

Pseudo-Leaks

这个被称为“秀逗泄露”真是恰当啊^-^

看看这个例子:

MS是这么解释的,这不是内存泄漏。如果您创建了许多无法获得也无法释放的对象,那才是内存泄漏。在这里,您将创建许多元素,Internet Explorer 需要保存它们以正确呈现页面。Internet Explorer 并不知道您以后不会运行操纵您刚刚创建的所有这些对象的脚本。当页面消失时(当您浏览完,离开浏览器时)会释放内存。它不会泄漏。当销毁页面时,会中断循环引用。

唉~~~

详细原因,大家可以看看http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp这篇文章。

其它一些琐碎的注意点:

* 变量定义一定要用var,否则隐式声明出来的变量都是全局变量,不是局部变量;
* 全局变量没用时记得要置null;
* 注意正确使用delete,删除没用的一些函数属性;
* 注意正确使用try...cache,确保去处无效引用的代码能被正确执行;
* open出来的窗口即使close了,它的window对象还是存在的,要记得删除引用;
* frame和iframe的情况和窗口的情况类似。

考资料参:

http://jibbering.com/faq/faq_notes/closures.html
http://javascript.weblogsinc.com/2005/03/07/javascript-memory-leaks/
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp
http://72.14.203.104/search?q=cache:V9Bt4_HBzQ8J:jgwebber.blogspot.com/2005/01/dhtml-leaks-like-sieve.html+DHTML+Leaks+Like+a+Sieve+&hl=zh-CN&ct=clnk&cd=9 (这是DHTML Leaks Like a Sieve)一文在google上的cache,原文已经连不上了)
http://spaces.msn.com/siteexperts/Blog/cns!1pNcL8JwTfkkjv4gg6LkVCpw!338.entry
http://support.microsoft.com/default.aspx?scid=KB;EN-US;830555
http://www.ajaxtopics.com/leakpatterns.html
http://blogs.msdn.com/ericlippert/archive/2003/09/17/53028.aspx
http://www.quirksmode.org/blog/archives/2005/02/javascript_memo.html
http://youngpup.net/2005/0221010713
http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx =
http://support.microsoft.com/kb/266071/EN-US ==>IE 5.0至5.5一些版本中的GC bug
http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html ==>ie 7的改进
http://erik.eae.net/archives/2006/04/26/23.23.02/ ==>ie 7的改进
http://www.feedbackarchive.com/spamvampire/today.html ==> Try this script for memory leaks - it leaked 50 megabytes in 15 minutes with firefox on linux:
http://birdshome.cnblogs.com/archive/2005/02/15/104599.html
http://www.quirksmode.org/dom/innerhtml.html
http://www.crockford.com/javascript/memory/leak.html
《JavaScript: The Definitive Guide》4th Edition
http://outofhanwell.com/ieleak/index.php?title=Main_Page
js补充高级:10、js分号问题、内存溢出与内存泄漏问题及解决方案 本文探讨了JavaScript中的两个关键问题:分号使用规范及内存管理。在分号问题上,文章指出虽然JS语句末尾可不加分号,但在特定情况下(如小括号或方括号开头的语句前)必须加分号以避免代码合并错误,并给出了实际案例说明。在内存管理方面,分析了内存溢出(程序需求超过可用内存)和内存泄漏(未及时释放内存)的区别,列举了三种常见的内存泄漏情况:意外的全局变量、未清理的计时器/回调函数以及闭包滥用,同时提供了相应的解决方案。文章通过代码示例直观展示了这些问题的影响和解决方法,为开发者提供了实用的编码建议。 阅读详情

相关推荐

S7-1200控制S120变频器

②:硬件目录下,添加实物S120设备进行组态(其它现场设备--PROFINET IO--DRIVES......②:双击S120进行IP地址和设备名称设置(注:此处要与STATER软件设置S120一致)M10.0接通时,电机开始运行,M10.0断开,电机停止,调试完成。①:将S7-1200与S120进行通讯连线。④:STATER软件下设置与组态一致的报文。①:点击添加新设备,按实物进行设备组态。②:打开OB1,编写启动停止程序。①:查看S120报文地址。②:模块下添加DO矢量。③:子模块下添加报文。

weixin_38261173的博客 4867

解决 JavaScript heap out of memory 报错

当我们在 丐版 云服务器中执行 node 命令的时候,如果服务器的内存比较小,介于 JavaScript 的语言特性,只能使用部分内存来进行操作,命令执行可能会报错: transforming (648) node_modules/axios/lib/axios.js <--- Last few GCs ---> [158365:0x4c20f70] 27361 ms: Scavenge 473.4 (476.6) -> 472.8 (476.6) MB, 66.4 / 0.0 m

全栈开发师的博客 2万+

本地部署大模型 vs 网页版大模型区别

fill:#333;color:#333;color:#333;fill:none;本地服务器/工作站硬件资源私有化部署GPU集群高速存储模型文件训练框架推理引擎。

Ds-Rag的博 1712

解决 JavaScript heap out of memory

启动前端服务时,堆内存不足

m0_38137988的博客 9220

Matlab生成dsp程序——环境搭建(c2000系列[F28335、F2837x]都适用)

一、环境配置 (28377D的操作是一模一样就是硬件设置的时候需要选择28377d进行相应的设置) 1)matlab与ccs联合编译需要安装对应的matlab版本和ccs版本,且只有2016a以上的matlab支持c2000系列。具体对应关系参照: http://software-dl.ti.com/ccs/esd/documents/ccs_matlab.html 2)matlab版本确定之后,还需要安装有关于ccs的相关软件: I、TI Code Composer Studio xxxx(对应

qq_42151264的博客 2万+

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型 当前AI企业级应用面临三大核心挑战:业务场景深度非标化、技术落地"最后一公里"困局、以及市场竞争焦点转向实用价值。前线部署工程师(FDE)作为破局关键,通过技术-业务-产品三维交汇的复合能力,将AI从实验室推向生产环境。FDE不仅是技术架构师,更是业务价值挖掘机和产品进化传感器,通过"碎石路-高速公路"双循环模式,将定制化需求沉淀为可复用的平台能力。这种模式颠覆了传统SaaS的销售逻辑,形成基于价值的J型增长

随笔记录-分享&记忆 3992

nodejs内存溢出(JavaScript heap out of memory)解决方案

执行nodejs的v8引擎在64位系统下默认只有1.4G内存,因此在大型前端项目(也和代码逻辑有关)编译过程中,经常遇到内存溢出问题。,在运行指令前运行脚本 cross-env LIMIT=4096 increase-memory-limit。运行指令时修改node内存,以vue项目为例。

baidu_21900061的博客 4171

等时替代模型( Isotemporal Substitution Model)

文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上)

姚巨龙的博客 1万+

JavaScript 报错 JavaScript heap out of memory;内存不足问题

在启动 NodeJS 时,使用的内存量是一直增大的,默认使用的内存量是受限的,大约是2GB,也就是2048MB,当内存使用量超过2048MB后,就会出错。在项目中也是因为没有设限内存的上限,自动默认为默认值。中修改 build 的内存空间,使用max-old-space-size参数,设定一个更大的值。项目动作:在入口文件中增加解密代码,未设定内存值之前 ,打包文件时会出现上面的错误。我放大到了 8192 MB。

duyanli7780com的博客 2886

2025年下半年网络工程师案例分析真题及答案解析

2025年下半年网络工程师案例分析真题及答案解析

鹿鸣天涯 1088

从代码仓库到知识库:自动化构建与RAG技术实践

在软件工程领域,代码库的规模与复杂性日益增长,如何高效管理和利用其中的知识成为关键挑战。传统文档工具主要依赖注释提取API信息,而现代知识构建技术则通过抽象语法树(AST)解析、自然语言处理等手段,深入理解代码结构、调用关系和业务逻辑。其核心价值在于将非结构化代码转化为机器可理解、可检索的结构化知识,显著提升代码资产的可维护性和团队协作效率。这一过程通常涉及代码解析、信息提取、向量化表示和存储索引四个关键阶段,其中向量化技术将代码语义转化为高维向量,为语义搜索奠定基础。结合检索增强生成(RAG)架构,开发者

weixin_42545292的博客 411

npm运行项目提示JavaScript heap out of memory(堆栈内存溢出问题)解决方案

1、堆栈内存溢出问题 npm ERR! code ELIFECYCLE npm ERR! errno 134 npm ERR! king-tech-front-frame@1.0.0 dev: `vue-cli-service serve` npm ERR! Exit status 134 npm ERR! npm ERR! Failed at the king-tech-front-frame@1.0.0 dev script. npm ERR! This is probably not a proble

我是晓说前端,一个正在进阶的前端开发。这里记录我在实际项目中踩过的坑和填过的缝——写下来是为了记住,分享出来是希望能帮到同样遇到问题的人。 1万+

Android蓝牙中的Rfcomm协议介绍

RFCOMM(Radio Frequency Communications)是一种基于蓝牙技术的串口仿真协议,以下是详细介绍:一、协议概述二、工作原理三、应用场景

手机-手表蓝牙开发工程师的博客 712

【转】关于Javascript的内存泄漏问题的整理稿

转载者续:难得的好文章,收藏了1年今天贡献出来。这篇文章需要反复推敲,最好配合IE内存溢出检测工具写代码测试,这样更容易理解JS变量、DOM之间的耦合关系。初学者朋友读起来会吃力,但我建议耐心看完,届时你对Javascript和dom的理解将有质的飞跃。----------------------------------------------------常规循

392

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

关于Javascript的内存泄漏问题的整理稿 转

常规循环引用内存泄漏和Closure内存泄漏 要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理。 我记得原来在犀牛书《JavaScript: The Definitive Guide》中看到过,IE使用的GC算法是计数器,因此只碰到循环 引用就会造成memory leakage。后来一直觉得和观察到的现象很不一致,直到看到Eric的文章,才明白犀牛...

weixin_30802273的博客 93

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

关于Javascript的内存泄漏问题的整理稿(转)

常规循环引用内存泄漏和Closure内存泄漏 要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理。 我记得原来在犀牛书《JavaScript: The Definitive Guide》中看到过,IE使用的GC算法是计数器,因此只碰到循环 引用就会造成memory leakage。后来一直觉得和观察到的现象很不一致,直到看到Eric的文章,才明白犀牛...

weixin_30332241的博客 147

如何解决co内存泄漏:Node.js终极异步流控优化指南

co作为Node.js生态中强大的异步流控库,通过generator函数简化了复杂异步逻辑的编写。然而在处理大规模并发或长时间运行的应用时,内存管理不当可能导致性能瓶颈。本文将深入探讨co的内存优化策略,帮助开发者构建更高效、更稳定的异步应用。 ## 为什么co会产生内存问题? co的核心机制是将generator函数转换为Promise链执行,这种转换过程中如果处理不当,容易造成闭包引用未释

gitblog_00020的博客 1005

JavaScript 内存泄漏

js 内存泄漏 什么是内存泄漏? 程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。 不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)。 有些语言(比如 C 语言)必须手动释放内存,程序员负责内存管理。 char * buffer; buffer = (char*) malloc(42); // Do somet

weixin_44682587的博客 7958

JS的内存泄漏问题

JS中存在的内存泄漏 内存泄漏最终将导致页面反应迟缓,崩溃,高延迟 1. 什么是内存泄漏 我们知道内存是有限的,比如8G,16G, 当我们创建了一些变量,其就会在内存中的对应位置 (堆栈的概念) 栈内存一般存储基础的数据类型(Number String Null undefined Boolean Symbol) 堆内存一般存储引用类型,包括对象Object和数组Array 但是我们如果一味的往里...

qq_24724109的博客 610

JavaScript内存泄漏的排查方法

本文转自JS内存泄漏排查方法——Chrome Profiles 概述Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是其中一个。Heap Profiling可以记录当前的堆内存(heap)快照,并生成对象的描述文件,该描述文件给出了当时JS运行所用到的所有对象,以及这些对象所占用的内存大小、引用的层级关系等等。这些描述文件为内存泄漏的排查提供了非常有用的信

charlene0824的博客 8690

JavaScript中造成内存泄漏的原因有哪些

在Web前端开发中,JavaScript是一门非常重要的编程语言。它的灵活性和强大的功能使得我们可以创建出丰富多样的交互式网页。然而,尽管JavaScript具有很多优点,但它也存在一些潜在的问题,其中之一就是内存泄漏。

有我更精彩的博客 1899

深入理解JavaScript闭包:避免常见的内存泄漏问题

深入理解JavaScript闭包:避免常见的内存泄漏问题

商务合作欢迎私信我 1万+

javascript内存泄漏

知识点: 1、什么是内存泄漏 2、内存生命周期 3、js内存管理机制 4、js内泄漏的一些场景 5.两种垃圾回收的算法 6、 如何发现内存泄漏 1、什么是内存泄漏 内存泄漏是指由于疏忽或错误造成程序未能释放已经不在使用的内存 内存泄漏并非指内存存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该内存之前就失去了对该内存的控制, 简单理解:无用的内存还在占用,得不到释放和归还,比较严重的时候,无用的内存还会增加,从而导致整个系统卡顿,甚至崩溃 2、内存生命周期 一般按照顺序分为三个周期

十九万里的博客 4969

JavaScript 中内存泄漏的几种情况

引用未被释放的对象是一种常见的内存泄漏情况。在JavaScript中,如果有对某个对象的引用,而后没有显式地释放这个引用,该对象就无法被垃圾回收机制回收。

蓝斑.json的博客 2179

javascript中的内存泄漏问题

内存泄漏是一个常见的性能问题,常常会导致程序的崩溃,运行缓慢,高延迟或者其他的一下问题;内存泄漏:内存泄漏是指分配给应用的内存不能被重新分配,即使在内存已经不被使用的时候。正常情况下,垃圾回收器在DOM元素和event处理器不被引用或访问的时候回收它们。但是,IE的早些版本(IE7和之前)中内存泄漏是很容易出现的,因为内存管理器不能正确理解Javascript生命周期而且在周期被打破(可以通过赋值为

一水茶缘~~ 588

JavaScript 垃圾回收与内存泄漏

在 JavaScript 开发中,垃圾回收和内存泄漏是两个重要的概念。垃圾回收机制可以自动管理内存,但如果不了解其原理,很容易导致内存泄漏,进而影响程序性能甚至导致崩溃。

前端小巷子的博客 1274
上一篇: 关于document.cookie的使用
下一篇: Javascrip中Event 的总结(转)
rush2012
博客等级 码龄14年 2粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值