h5 名字 能够 乱叫 繁體版
原文   原文链接

问题来自一位叫小白的同事的疑问,问题以下:正则表达式

var str = '[img_/storage/uploads/2016/1465955105.2148.jpg]';
str = str.replace(/\[img_(\S*)\]/g,"<img src='$1' class='chatImg'>");

或者跨域

var str = '[img_/storage/uploads/2016/1465955105.2148.jpg]';
var name = new RegExp("\[img_(\S*)\]",'g');
str = str.replace(name,"<img src='$1' class='chatImg'>");

正则大神现身,这两种写法有什么区别?为何结果不一样?浏览器

不管怎么试都有问题,首先上面的正则有点问题,咱们调整一下:闭包

var str = '[img_/storage/uploads/2016/1465955105.2148.jpg]';
var aa = /\[img_(\S*)\]/g;
var bb = new RegExp("\\[img_(\\S\*)\\]",'g');
var cc = "<img src='$1' class='chatImg'>";

//方法1
str.replace(aa, cc);

//方法2
str.replace(bb, cc);

结果同样了,这就是一个正则的问题
原本到这里就完了,但是小白仍是很执着的,为何他写的不行,他再次用正确的正则来测试,代码贴出来以下:测试

显然他以前也测试过,只是用 replace 来作验证的,我测试也不通,就测试 new RegExp得出的结果是否同样了,不知不觉,改了变量名来测试了,重复的东西别我提取,专门测试不同的地方,反而避免了这个 name 变量名的问题网站

var str = '[img_/storage/uploads/2016/1465955105.2148.jpg]';
var name = new RegExp("\\[img_(\\S\*)\\]",'g');
str = str.replace(name,"<img src='$1' class='chatImg'>");

怎么会仍是不行,此次正则绝对没错了,都测试经过了url

结果此次在控制台测试,确实不经过,咦为何?spa

小白得出个暂时的结论:var 正则,不能用 name 来命名调试

这就奇怪了,哪有这样的道理,你觉得你是谁啊,你又不是关键字、保留字,还不让做为变量用了,凭什么不让命名?还限制正则不让用?code

没有这样的道理,这时我才注意到 name 这个名字的特别处,我有个印象,name 是做为 window 的一个属性在使用,做为当前窗口(tab 页)的名称,即便网站都跳转走了,只要当前窗口没变,那么 name 值一直存在,不跟 url 相关,这能够用来为跨域来用

这里难道有问题,因而专注测试 name 这个特殊变量:

var name = new RegExp("\\[img_(\\S\*)\\]",'g');
//输出 name
//"/\[img_(\S*)\]/g"

而

var bb = new RegExp("\\[img_(\\S\*)\\]",'g');
//输出 bb
//\[img_(\S*)\]/g

在控制台下调试,不细看就错过去了,差了分号,上面的结果实际变成字符串了

奇怪啊,正则不行,变量类型都变了,我试试其余数据类型,

图片描述

也是不行,但在闭包里能够了,这是 name 这个值做为特定属性,被限制为“强数据类型”了,js 中一直没有此概念,普通变量,我想什么类型就什么类型,赋值就能够了,这里一个大坑,真是不可料想,变量类型不可变(自动转为 String 类型)

还有其余变量是这样的么,呵呵,这根本无法预料,这个浏览器用这个名字,鬼知道那么多浏览器,谁会不会偶尔又用了一个变量名字呢,他又有什么限制呢!!!

旧事重提,一直说尽可能避免使用全局变量,今天又上了一课,若是不遵照,终会摔跟头,并且死都不知道怎么死的,另外变量名称真的不是随便用的,良好的命名规范,能避免出现这种状况,和非意义的变量名aa, bb相比,name明显有具体指代,指某名称,做为一个正则表达式的值来用,确有不合理之处,名字不能够随便叫啊。不过也正由于如此,发现这个变量名原来还有这种限制。

咱们当前的开发,几乎不存在使用全局变量的状况了,全都使用闭包封装了,能避免变量被污染(或者出现上面变量类型被限制的状况),但个别状况,简单页面,仍是存在不适用闭包把本身的变量所有包装的状况,这是极可能出问题

因此只要能用闭包包装,尽可能把本身的逻辑包装起来,省得再出现相似的诡异问题

相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公众号
   欢迎关注本站公众号,获取更多信息