H5有坑,名字不可以亂叫

2021-09-16 23:25:01 字數 2338 閱讀 7485

問題來自一位叫小白的同事的疑問,問題如下:

或者

正則大神現身,這兩種寫法有什麼區別?為什麼結果不同?

無論怎麼試都有問題,首先上面的正則有點問題,我們調整一下:

//方法1

str.replace(aa, cc);

//方法2

str.replace(bb, cc);

結果一樣了,這就是乙個正則的問題

本來到這裡就完了,可是小白還是很執著的,為什麼他寫的不行,他再次用正確的正則來測試,**貼出來如下:

顯然他之前也測試過,只是用 replace 來做驗證的,我測試也不通,就測試 new regexp得出的結果是否一樣了,不知不覺,改了變數名來測試了,重複的東西別我提取,專門測試不一樣的地方,反而避免了這個 name 變數名的問題

怎麼會還是不行,這次正則絕對沒錯了,都測試通過了

結果這次在控制台測試,確實不通過,咦為什麼?

小白得出個暫時的結論:var 正則,不能用 name 來命名

這就奇怪了,哪有這樣的道理,你以為你是誰啊,你又不是關鍵字、保留字,還不讓作為變數用了,憑什麼不讓命名?還限制正則不讓用?

沒有這樣的道理,這時我才注意到 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明顯有具體指代,指某名稱,作為乙個正規表示式的值來用,確有不合理之處,名字不可以隨便叫啊。不過也正因為如此,發現這個變數名原來還有這種限制。

我們當前的開發,幾乎不存在使用全域性變數的情況了,全都使用閉包封裝了,能避免變數被汙染(或者出現上面變數型別被限制的情況),但個別情況,簡單頁面,還是存在不適用閉包把自己的變數全部包裝的情況,這是很可能出問題

所以只要能用閉包包裝,盡量把自己的邏輯包裝起來,免得再出現類似的詭異問題

h5頁面不可 移動 h5移動端讓文字不可選中複製

nosql之 mongodb 學習 三 配置檔案說明 python環境中執行程式 執行python程式,我們比較常用的是直接在windows命令提示視窗或者linux終端或shell視窗中,直接 python py,或者在linux環境下,在投不中,加入 usr bin headfirst設計模式之...

app內嵌H5遇到的部分坑

1.input元件 input設定type number 鍵盤彈出為數字 問題 1 input的maxlength屬性失效 只能通過輸入事件來對輸入的值進行限制 2 樣式問題 在部分的android手機上面出現樣式問題,需要去掉input的預設樣式 2.select元件 select設定問題 1 禁...

H5小遊戲 看你有多色

使用了封裝了canvas的create.js庫來實現的。最終效果 工程 rect.js 方塊類 function rect n,color,specialcolor 獲取方塊的型別 this.getrecttype function 設定方塊的顏色 繪製方塊 this.setcolor functi...