当前位置:
首页 > temp > JavaScript教程 >
-
JS 闭包 BUG
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>
测试截图:
来源:https://www.cnblogs.com/s0611163/p/15257205.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数