iT邦幫忙

0

前端JS-用立即函式封裝的重要性?若沒有後端,是不是比較沒關係!?

  • 分享至 

  • xImage

某個js前輩的常常跟我說,他寫js都會用IIFE封裝起來,
其目的是為了讓USER沒辦法從console裡面拿到變數、function。

我大概明白這樣子做,比較有保護,不過我不太懂的是,這樣子會造成那些可能的風險呢?
舉例來說,也許我今天的網站只是提供一個計算字數的工具,
又或者只是一個時鐘頁面,是否這種東西就沒有那麼一定要封裝起來呢?

畢竟就算給你拿到參數,讓你破壞掉頁面,似乎也就只影響到client端那邊的東西。

所以我想要大概歸類,有哪些網站或應用會「必須封裝」,我個人認為:
應該是有資料要跑後端的比較需要擔心。
靜態單機的頁面,就算我寫個遊戲,讓人家拿到變數任意改變,似乎也沒有太大的關係。

我知道這是個好習慣,
但如果我只是寫個靜態網站,就算不封裝,實質上應該也沒有風險!?!?

看更多先前的討論...收起先前的討論...
ckp6250 iT邦好手 1 級 ‧ 2023-01-28 06:21:40 檢舉
勿以惡小而為之,勿以善小而不為?
@ckp6250 常言如此,以學者精神,必要先定義什麼是惡,這屬於格物致知,哲學愛智精神~因此了解風險的範疇對我來說很重要,不喜歡「就照做」。謝謝您分享名言佳句。
bill0704 iT邦新手 5 級 ‧ 2023-01-28 17:05:33 檢舉
我想還有一個好處可能是IIFE後的函式會被記憶體回收,可以避免佔用使用者資源(雖然你可能覺得沒多大XD),還有占用到全域變數,畢竟有時大家各寫各的,在打包時import沒有define好還可能會汙染到global,或許要說IIFE有時也是個保險吧,你前輩有這習慣可能也是踩過一些坑,以學者精神,可能要去研究你前輩比較實在XD?
淺水員 iT邦大師 6 級 ‧ 2023-01-28 17:24:52 檢舉
iife 可以避免變數名稱汙染
不過現在用框架應該不用特別這樣寫了,ES6以前應該都是這樣寫沒錯,部過這個比較偏向可維護性的問題
https://stackoverflow.com/questions/37399295/do-we-need-to-wrap-es6-code-in-an-iife

ES6可以用 {} 設作用域 有
deh iT邦研究生 1 級 ‧ 2023-01-29 00:01:20 檢舉
樓上正解
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
eric19740521
iT邦新手 1 級 ‧ 2023-01-29 15:08:37
最佳解答

我分享一個JS封裝的程式B4X案例

1.B4X BANano+BANanoElement(Umbrella JS) 封裝JS+HTML

這是我製作的說明影片(有一系列喔)
https://www.youtube.com/watch?v=fH8fvy7P4Vs

B4X 介紹在 https://www.b4x.com/

2.我希望利用Basic(B4X)優點來撰寫網頁程式
未來有一個新的小範例影片(我還未製作出來)

https://b234.top/ 帳號密碼都是1
你可以看原始碼都是HTML+JS

底下的程式碼.我先列出來給你看.
不是看不到JS.而是我封裝起來了..變成物件class.
利用物件的優點...

Sub Class_Globals
	'Private fx As JFX
	Private BANano As BANano 'ignore
	Dim page As xPage	'HTML Page物件
	Dim mdl As xModal	'BS物件
	
	Dim uname As xTextBox	'BS物件
	Dim upwd As xTextBox	'BS物件
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
	
End Sub


public Sub show
	page.Initialize("body",Me)

	page.Root.Empty
	page.Root.AddLoginFormV1("Login")
	mdl = page.Root.AddModal("mdlLogin")
	
	uname = page.Root.GetElement("xTextBox","uname")
	upwd = page.Root.GetElement("xTextBox","upwd")
End Sub


Sub Login_Yes_click(e As BANanoEvent)
	
	If uname.Value.trim = "" Or upwd.Value.trim = "" Then
		mdl.Message = "登入失敗!!帳號/密碼必須輸入"
		mdl.Show

		Return
	End If
	
	Dim headers As Map
	headers.Initialize
	headers.put("Content-Type", "application/json")
	headers.Put("Authorization", "BANBasic " & BANano.ToBase64(uname.value & ":" & upwd.value))
	Dim res As String = BANano.CallAjaxWait("http://localhost/api","POST","json", $""$, False, headers)
	
	Log(res)
	
	'{"BANanoStatus": 801, "BANToken": "zJVAI1eYfjJh+UN1p80Bp/IiW60+hKMguZxT4T6Rp6ZnsbEFpinYBw==", "BANExpires": 90}
	'{"BANanoStatus": 800,"Message": "ERROR!!驗證失敗"}
	Dim json As BANanoJSONParser
	json.Initialize(res)
	Dim m As Map = json.NextObject
	Dim CheckStatus As Int = m.GetDefault("BANanoStatus",0)
	
	Log("res狀態: "&CheckStatus)
	Select Case CheckStatus
		Case 801 '登入成功
			Dim expires As Int = m.GetDefault("BANExpires", 0)
			BANano.SetCookie("BANanoDemoCookie", m.GetDefault("BANToken", ""), $"{"expires": ${expires}}"$)
		
			Dim p As PageMain	'主頁面
			p.Initialize
			p.show
			
		Case Else ' login is not ok
			Log("登入失敗!!")
			mdl.Message = "登入失敗!!"
			mdl.Show
	End Select
	
 
End Sub
  

所以阿!!最後.變成我都用B4X去寫程式碼?!!!

底下是一位網友製作出來的SithasoDaisy..給你參考
https://www.b4x.com/android/forum/threads/sithasodaisy-tailwindcss-webapps-using-b4x.143950/
SithasoDaisy: TailwindCss WebApps using B4x

補充補充一下:
未來還有一個新的小範例影片(我還未製作出來)...

謝謝很精彩,有點複雜,我慢慢研究。感謝分享

沒想到.評為最佳.那我就詳細講
按照底下步驟做.軟體免費.
1.安裝B4J.內有安裝說明
https://www.b4x.com/b4j.html

安裝起來.IDE-->File-->New-->UI (選擇一個簡單的範例)

IDE-->RUN 執行編譯...跑看看...
這步驟可以了.才做下面的

2.介紹怎麼使用 BANano,產生Web網站
https://www.youtube.com/watch?v=U3tbVdJGmHM

影片下方有介紹怎麼 額外安裝BANano

  1. 1+2 ,沒那麼難拉!!都是按照步驟一步步做...

比那 android IDE 容易太多了

0.B4X 能寫桌面win/Mac OS/Linux
安卓手機/iphone/網頁.... 這些可以慢慢去玩

0

其實,這個東西跟你之前問的「臭長程式碼」那一篇,本質是一樣的道理。

在那一篇中,我有說到了其實那個作法等同物件化的前身處理作做。
這只是一種物件封裝化。

但一樣就如那一篇說的。這樣的做法並沒有所謂的好與不好,重要及不重要。
一切還是得看功能性而定。

就如單純1+1的程式碼,你將其封裝「加1」
這樣就太過矯往過正。

但如果是封裝了一個「計算機」裏面包含了所有的運算子。這樣就不錯。

封裝程式碼,並不一定是為了風險及安全性。
其也包含了可讀性、可利用性、可組合性。

看事情並不能單看一面來看待。

先給您點讚,有些事情我的思考層次還是太低了,我來慢慢細品!
感謝說明!

我要發表回答

立即登入回答