成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

H5有坑,名字不可以亂叫

XGBCCC / 3434人閱讀

問(wèn)題來(lái)自一位叫小白的同事的疑問(wèn),問(wèn)題如下:

var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]";
str = str.replace(/[img_(S*)]/g,"");

或者

var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]";
var name = new RegExp("[img_(S*)]","g");
str = str.replace(name,"");

正則大神現(xiàn)身,這兩種寫法有什么區(qū)別?為什么結(jié)果不同?

無(wú)論怎么試都有問(wèn)題,首先上面的正則有點(diǎn)問(wèn)題,我們調(diào)整一下:

var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]";
var aa = /[img_(S*)]/g;
var bb = new RegExp("[img_(S*)]","g");
var cc = "";

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

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

結(jié)果一樣了,這就是一個(gè)正則的問(wèn)題
本來(lái)到這里就完了,可是小白還是很執(zhí)著的,為什么他寫的不行,他再次用正確的正則來(lái)測(cè)試,代碼貼出來(lái)如下:

顯然他之前也測(cè)試過(guò),只是用 replace 來(lái)做驗(yàn)證的,我測(cè)試也不通,就測(cè)試 new RegExp得出的結(jié)果是否一樣了,不知不覺,改了變量名來(lái)測(cè)試了,重復(fù)的東西別我提取,專門測(cè)試不一樣的地方,反而避免了這個(gè) name 變量名的問(wèn)題

var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]";
var name = new RegExp("[img_(S*)]","g");
str = str.replace(name,"");

怎么會(huì)還是不行,這次正則絕對(duì)沒錯(cuò)了,都測(cè)試通過(guò)了

結(jié)果這次在控制臺(tái)測(cè)試,確實(shí)不通過(guò),咦為什么?

小白得出個(gè)暫時(shí)的結(jié)論:var 正則,不能用 name 來(lái)命名

這就奇怪了,哪有這樣的道理,你以為你是誰(shuí)啊,你又不是關(guān)鍵字、保留字,還不讓作為變量用了,憑什么不讓命名?還限制正則不讓用?

沒有這樣的道理,這時(shí)我才注意到 name 這個(gè)名字的特別處,我有個(gè)印象,name 是作為 window 的一個(gè)屬性在使用,作為當(dāng)前窗口(tab 頁(yè))的名稱,即使網(wǎng)站都跳轉(zhuǎn)走了,只要當(dāng)前窗口沒變,那么 name 值一直存在,不跟 url 相關(guān),這可以用來(lái)為跨域來(lái)用

這里難道有問(wèn)題,于是專一測(cè)試 name 這個(gè)特殊變量:

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

而

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

在控制臺(tái)下調(diào)試,不細(xì)看就錯(cuò)過(guò)去了,差了分號(hào),上面的結(jié)果實(shí)際變成字符串了

奇怪啊,正則不行,變量類型都變了,我試試其他數(shù)據(jù)類型,

也是不行,但在閉包里可以了,這是 name 這個(gè)值作為特定屬性,被限制為“強(qiáng)數(shù)據(jù)類型”了,js 中一直沒有此概念,普通變量,我想什么類型就什么類型,賦值就可以了,這里一個(gè)大坑,真是不可料想,變量類型不可變(自動(dòng)轉(zhuǎn)為 String 類型)

還有其他變量是這樣的么,呵呵,這根本沒法預(yù)料,這個(gè)瀏覽器用這個(gè)名字,鬼知道那么多瀏覽器,誰(shuí)會(huì)不會(huì)偶爾又用了一個(gè)變量名字呢,他又有什么限制呢?。?!

舊事重提,一直說(shuō)盡量避免使用全局變量,今天又上了一課,如果不遵守,終會(huì)摔跟頭,而且死都不知道怎么死的,另外變量名稱真的不是隨便用的,良好的命名規(guī)范,能避免出現(xiàn)這種情況,和非意義的變量名aa, bb相比,name明顯有具體指代,指某名稱,作為一個(gè)正則表達(dá)式的值來(lái)用,確有不合理之處,名字不可以隨便叫啊。不過(guò)也正因?yàn)槿绱?,發(fā)現(xiàn)這個(gè)變量名原來(lái)還有這種限制。

我們當(dāng)前的開發(fā),幾乎不存在使用全局變量的情況了,全都使用閉包封裝了,能避免變量被污染(或者出現(xiàn)上面變量類型被限制的情況),但個(gè)別情況,簡(jiǎn)單頁(yè)面,還是存在不適用閉包把自己的變量全部包裝的情況,這是很可能出問(wèn)題

所以只要能用閉包包裝,盡量把自己的邏輯包裝起來(lái),免得再出現(xiàn)類似的詭異問(wèn)題

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82255.html

相關(guān)文章

  • H5頁(yè)面二次分享

    摘要:對(duì)于頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。通篇看完的話,基本上能避過(guò)很多坑記得微信文檔習(xí)慣把一些坑寫在后面,不放在一起先說(shuō)說(shuō),怎么微信怎么做二次分享文檔地址,通過(guò)引入官方。 對(duì)于H5頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟qq還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。和PC端不同,PC直接復(fù)制地址了。前兩天在做請(qǐng)柬,踩了不少的雷,個(gè)人開發(fā)和公司開...

    evin2016 評(píng)論0 收藏0
  • H5頁(yè)面二次分享

    摘要:對(duì)于頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。通篇看完的話,基本上能避過(guò)很多坑記得微信文檔習(xí)慣把一些坑寫在后面,不放在一起先說(shuō)說(shuō),怎么微信怎么做二次分享文檔地址,通過(guò)引入官方。 對(duì)于H5頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟qq還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。和PC端不同,PC直接復(fù)制地址了。前兩天在做請(qǐng)柬,踩了不少的雷,個(gè)人開發(fā)和公司開...

    layman 評(píng)論0 收藏0
  • h5 vue引入微信sdk 實(shí)現(xiàn)分享朋友圈,分享給朋友,獲取地理位置

    最近入職的公司主要做微信端的h5,所以在所難免要引用sdk。雖然官方文檔寫的還算清楚,但是還是有坑。 1.在index.html中 引入微信sdk 2.在assets/js 下新建文件 wx.js export default { wxShowMenu: function (that,sign=) { let url = window.location.href.split(#)[...

    tomorrowwu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<