如何防止重複宣告 JavaScript 變數?
在本教程中,我們將瞭解幾種防止重複宣告 JavaScript 變數的方法,並對它們進行比較,以瞭解哪種方法在給定上下文中更適用。
防止重複宣告變數的最佳方法是避免建立全域性變數。
讓我們繼續討論這個問題。
將程式碼包裝在函式中
在這裡,在函式內部宣告的變數在函式外部無法訪問,反之亦然。使用者可以按照以下語法使用此方法。
語法
(function(){ var varNam = "test"; }())
這裡 varNam 被包裝在一個函式中。
示例
在這個程式中,我們有一個名為 test 的變數被包裝在一個函式中。我們可以在函式內部訪問它。當用戶嘗試在函式外部訪問此變數時,我們在 catch 塊中得到一個錯誤。
<html> <head> <title>A program that prevents duplicate variable declaration by wrapping code within a function.</title> </head> <body> <p id="prevDupInp"></p> <div id="prevDupOpWrap"> <p>Click this button to access the same variable outside the function</p> <button id="prevDupBtn" onclick="doAccessVariable()">Click Here</button> </div> <p id="prevDupOut"></p> <script> function displayInput() { (function() { var prevDupInpEl = document.getElementById("prevDupInp"); var prevDupInpDat = "variableName inside the function - "; var variableName = "test"; prevDupInpEl.innerHTML = prevDupInpDat + variableName; }()) } displayInput(); function doAccessVariable() { var prevDupOutEl = document.getElementById("prevDupOut"); var prevDupOutDat = "variableName outside the function - "; var prevDupBtnEl = document.getElementById("prevDupBtn"); try { prevDupOutEl.innerHTML = prevDupOutDat + variableName; } catch (e) { prevDupOutEl.innerHTML = prevDupOutDat + e; } prevDupOpWrap.style.display = "none"; } </script> </body> </html>
使用 JavaScript 的 use strict 指令
use strict 指令表示 JavaScript 程式碼必須在嚴格模式下執行。嚴格指令不是語句,而是一個常量表達式。早期的 JavaScript 版本忽略了這個表示式。
在嚴格模式下編寫程式碼時,我們不能使用未宣告的變數。除 IE9 及以下版本外,所有現代瀏覽器都支援此 JavaScript 指令。嚴格模式允許我們編寫更清晰的程式碼,因為它會在我們在程式中使用未宣告的變數時丟擲錯誤。
“use strict”是一個字串。要啟用嚴格模式,我們需要在指令碼開頭編寫此字串。在開頭編寫意味著它具有全域性作用域。
使用此 JavaScript 指令的優點是我們得到了安全的程式碼。以前會忽略錯誤的語法。例如,以前錯誤鍵入的變數名會成為全域性變數。在嚴格模式下,它會為此變數返回錯誤,我們可以糾正它。嚴格模式也用於函式。
使用者可以按照以下語法使用此方法。
語法
'use strict'; const v = "Strict";
這裡,語法中的第一行是指令,v 是遵循嚴格模式的變數。
示例
在這個程式中,我們有一個未宣告的變數 p。在非嚴格模式下,我們可以在輸出中顯示它。當用戶選擇嚴格模式時,我們不能顯示其值。相反,它會在 catch 塊中丟擲錯誤。
<html> <head> <title>JavaScript program that prevents duplicate variable declaration using the JavaScript strict mode.</title> </head> <body> <p>Prevents duplicate variable declaration using the JavaScript strict mode</p> <p id="useStrictInp"></p> <div id="useStrictOutWrap"> <p>Click this button to enter strict mode</p> <button id="useStrictBtn" onclick="getStrictMode();">Click Here</button> </div> <p id="useStrictOut"></p> <script> var useStrictEl; var useStrictData; var useStrictWrap = document.getElementById("useStrictOutWrap"); function getStrictMode(){ "use strict"; try{ x = 10; useStrictData = "Undeclared variable in strict mode -
" + p; } catch(e){ useStrictData = "Undeclared variable in strict mode -
" + e; } useStrictEl = document.getElementById("useStrictOut"); useStrictEl.innerHTML = useStrictData; useStrictWrap.style.display = "none"; } function noStrict(){ y = 10; useStrictEl = document.getElementById("useStrictInp"); useStrictData = "Undeclared variable in normal mode -
" + q; useStrictEl.innerHTML = useStrictData; } noStrict(); </script> </body> </html>
使用 let 關鍵字宣告具有塊級作用域的變數
我們可以使用此方法來防止在迴圈內重複宣告 JavaScript 變數。
當在多個迴圈中使用相同的變數時,我們會收到宣告警告。我們可以使用關鍵字 let 來宣告變數以防止這種情況。使用 let 宣告的變數具有塊級作用域。
使用者可以按照以下語法使用此方法。
語法
for(let j=0;j<3;j++){ //block1 for(let j=0;j <4;j++){ //block2 } }
這裡,我們有兩個具有不同作用域的單獨程式碼塊。
示例
在這個例子中,我們有一個外迴圈,長度為 4,一個內迴圈,長度為 5。首先,我們嘗試使用 var 變數宣告來顯示迴圈。在這裡,我們只顯示一次迴圈值。接下來,使用者請求 let 宣告。在這裡,我們 4 次顯示迴圈值。這是這裡正確的迴圈執行。
<html> <body> <p id="letDeclInp"></p> <div id="letDeclWrap"> <p>Click this button to use the let keyword</p> <button id="letDeclBtn" onclick="blockScope(true)">Click Here</button> </div> <p id="letDeclOp"></p> <script> function blockScope(isLet){ var letDeclSel = isLet ? "letDeclOp" : "letDeclInp"; var letDeclEl = document.getElementById(letDeclSel); var letDeclBtn = document.getElementById("letDeclBtn"); var letDeclWrap = document.getElementById("letDeclWrap"); var letDeclDat = isLet? "Same loop variable: 4 times outer loop and 5 times inner loop using let declaration - " : "Same loop variable: 4 times outer loop and 5 times inner loop using var declaration - "; if(isLet){ for(let j=0;j<3;j++){ for(let j=0;j<4;j++){ letDeclDat+= j; } letDeclDat+= "
"; } } else{ for(var j=0;j<3;j++){ for(var j=0;j<4;j++){ letDeclDat+= j; } letDeclDat+= "
"; } } letDeclEl.innerHTML = letDeclDat; if(isLet) letDeclWrap.style.display = "none"; } blockScope(false); </script> </body> </html>
本文幫助我們學習如何防止重複宣告變數。首先,我們將變數包裝在函式中,以避免從外部訪問它。
其次,我們使用嚴格的 JavaScript 指令,透過丟擲異常來防止重複變數。
最後一種方法是在迴圈中使用 let 關鍵字宣告變數。
我們建議將函式包裝方法作為最佳方法。