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. 使用DHorse发布SpringBoot项目到K8S

    前言 在介绍DHorse的操作之前,先来介绍一下使用k8s发布应用的步骤,以SpringBoot应用为例进行说明. 1.首先从代码仓库下载代码,比如GitLab: 2.接着进行构建,比如使用Maven ...

  2. Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。

    根据输入的公司编号.名称.网址,格式化输出公司信息.其中 1)冒号统一为英文冒号,编号占6位,不足6位的前面补0.编号后面是制表符. 2)"公司名称:" 后面输出字符串占8位,左对 ...

  3. 【外包杯】【无语的报错】意想不到的逗号Unexpected comma.(已解决)

    解决了,答案是没保存,看见那些文件是型号了吗,就是这个原因.

  4. 【GIT】学习day03 | 如何生成并配置SSH公钥【外包杯】

    快速笔记: 1.注册并激活码云账号 2.生成并配置SSH公钥(运行ssh -t git@gitee.com 检测SSH公钥是否配置成功) 3.创建空白的码云仓库 4.把本地项目上传到码云对应的空白仓库 ...

  5. ElasticSearch索引生命周期策略配置(ES TTL)

    背景 有些索引数据作为临时数据存放,一段时间后我们希望索引可以自动过期删除,就是常说的TTL(Time To Live)机制 ElasticSearch索引数量过多会占用很多主分片和副本分片,最终导致 ...

  6. Reactor实战,创建一个简单的单线程Reactor(理解了就相当于理解了多线程的Reactor)

    单线程Reactor package org.example.utils.echo.single; import java.io.IOException; import java.net.InetSo ...

  7. Vue2.0 学习 第二组 语法模板

    本笔记主要参考菜鸟教程和官方文档编写. 1.文本绑定 一般在dom中用{{}}标时,并且在vue构造体内的data中定义文本内容 <div id="app">    & ...

  8. 【笔记整理】[案例]爱词霸翻译post请求

    import json if __name__ == '__main__': import requests resp = requests.post( url="http://ifanyi ...

  9. Selenium-无头模式headless

    无头模式适合的场景: 部署到没有gui界面的服务器,比如linux 开发环境测试完全没问题后可以使用无头模式,提高selenium速度. # 使用headless无界面浏览器模式 chrome_opt ...

  10. 使用容器快速在阿里云 ECS 多节点上搭建 Citus 12.1 集群

    阿里云 ECS 机器节点 这里我们使用两台同一区域的 ECS 机器. 机器配置:2 核 2 G.(ps: 阿里云 99 元一年的活动) 一台安装 coordinator(协调器),这里内网 IP 为 ...