C.js代码:

/**
* 有BUG
*/ (function (global) {
var _id;
var _map;
var _length; global.C = function () {
_map = {};
_length = 0;
}; global.C.prototype = {
setId: function (id) {
_id = id;
}, getId: function () {
return _id;
}, put: function (key, value) {
if (!_map.hasOwnProperty(key)) {
_length++;
}
_map[key] = value;
}, get: function (key) {
if (_map.hasOwnProperty(key)) {
return _map[key];
}
return null;
},
}; global.C.prototype.constructor = global.C; })(window);

错误原因:代码中_id、_map、_length变量是C的所有实例共用的。

D.js代码:

/**
* 无BUG
*/ (function (global) { global.D = function () {
this._map = {};
this._length = 0;
}; global.D.prototype = {
setId: function (id) {
this._id = id;
}, getId: function () {
return this._id;
}, put: function (key, value) {
if (!this._map.hasOwnProperty(key)) {
this._length++;
}
this._map[key] = value;
}, get: function (key) {
if (this._map.hasOwnProperty(key)) {
return this._map[key];
}
return null;
},
}; global.D.prototype.constructor = global.D; })(window);

test.html代码:

<!DOCTYPE html>
<html>
<head>
<title>JS闭包测试</title> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <style type="text/css">
</style> <script type="text/javascript" src="jquery-1.7.1.js"></script>
<script type="text/javascript" src="C.js"></script>
<script type="text/javascript" src="D.js"></script> </head>
<body>
<input type="button" value="测试1" onclick="test()" />
<div id="div" style="height:800px;"></div> <script type="text/javascript">
var div = $("#div"); function log(msg) {
div.append(msg + " ");
} function logLine(msg) {
div.append(msg + "<br />");
} //测试
function test() {
var c1 = new C();
var c2 = new C();
var d1 = new D();
var d2 = new D(); c1.setId("id1");
c2.setId("id2");
d1.setId("id1");
d2.setId("id2"); logLine(c1.getId());
logLine(c2.getId());
logLine(d1.getId());
logLine(d2.getId()); debugger;
c1.put("key1", "value1");
c2.put("key1", "value2");
d1.put("key1", "value1");
d2.put("key1", "value2"); logLine(c1.get("key1"));
logLine(c2.get("key1"));
logLine(d1.get("key1"));
logLine(d2.get("key1"));
} </script>
</body>
</html>

测试截图:

JS 闭包 BUG的更多相关文章

  1. js闭包之我见

    很久前的一个问题终于得以解决,内心是无比喜悦的,不多说,先上代码: function test(){ for(var i=0;i<5;i++){ window.onclick=function( ...

  2. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  3. 大部分人都会做错的经典JS闭包面试题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  4. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

  5. js闭包之初步理解( JavaScript closure)

    闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...

  6. (原创)JS闭包看代码理解

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  7. js闭包理解

    js闭包的作用是使函数外可以访问函数内部的变量,是通过 在函数内部 定义 访问函数内变量 的函数实现的,内部的一个函数产生一个闭包 function a() { var i=0; return fun ...

  8. js闭包理解实例小结

    Js闭包 闭包前要了解的知识  1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...

  9. Js闭包的用途

    本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...

  10. js闭包和ie内存泄露原理

    也议 js闭包和ie内存泄露原理 可以, 但小心使用. 闭包也许是 JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档. 有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给 ...

随机推荐

  1. 想基于AI变现吗,这个Star有1.8K的开源项目分享给你

    前言 在如今AI爆发的时代,每个人都想借着AI这股风,进行变现,今天给大家分享一个开源项目,他可以让你基于AI的能力进行变现 项目介绍 这个项目在Github有1.8k个star,可见其欢迎程度,作者 ...

  2. 随机森林(Random Forest)--- 转载

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  3. C# 基础编程题集锦

    简单字符串加密 编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下: 'a→d' 'b'→'e' 'w'→z' ...... x'→'a' 'y'→b' 'z→c' 'A'→'D' ...

  4. N100低功耗win11安装wsl2当入门nas

    前言 最近入了一台16gb+512gb的N100,想着用来存些资源,当个nas,偶尔要用用windows系统,所以想直接在这上面搞个虚拟机算了,WSL2似乎是一个不错的选择,下面介绍捣鼓的教程. 没用 ...

  5. 容器网络Cilium:DualStack双栈特性分析

    本文分享自华为云社区<容器网络Cilium入门系列之DualStack双栈特性分析>,作者: 可以交个朋友. 一 . 关于IPV6/IPV4 双栈 目前很多公司开始将自己的业务由ipv4切 ...

  6. 华企盾防泄密软件关于U盘无法注册问题

    1.以管理员权限运行控制台注册 2.如果是非加密注册可在USB拔插日志中右键日志远程注册 3.检查USB的驱动程序注册表是否都有 4.换一台电脑安装控制台注册 5.检查是否有与驱动有关的程序卸载试试 ...

  7. TiDB故障处理之让人迷惑的Region is Unavailable

    背景 最近某集群扩容了一批物理机,其中 TiKV 节点有6台机器12个实例,同时调整了 label 设置增加了一层机柜级容灾.因为前期做了比较充分的准备工作,到了变更窗口只等着执行scale-out就 ...

  8. 获取微信的token工具类

    import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpUtil; import cn.RedisUtil; impor ...

  9. StringBuilder、StringBuffer

    StringBuilder 1.concat() 拼接字符串 2.indexOf() 查找 3.replace() 替换 4.subString(1,2) 截取 0,1,2 1开始 2结束 Strin ...

  10. CentOS基线检测脚本

    本脚本适用于CentOS 7.5-7.9版本,其他版本不详 1.检查系统信息 查看代码 echo " " echo "########################## ...