initial commit
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# JavaScript Silent Crash: Block-Scoped `const` in `try`
|
||||
|
||||
**Pattern:** A `const` (or `let`) declared inside a `try {}` block is referenced
|
||||
outside the block. JavaScript throws a `ReferenceError` that silently crashes
|
||||
async event handlers — no error visible in the UI, no console output if the
|
||||
handler is an `addEventListener` callback calling an `async function`.
|
||||
|
||||
## Example
|
||||
|
||||
```javascript
|
||||
async function handleFinancialCompletion() {
|
||||
// ...
|
||||
try {
|
||||
const roData = getROData(roId); // block-scoped to try
|
||||
// ...
|
||||
} catch (e) {}
|
||||
|
||||
// BUG: roData is undefined here — ReferenceError
|
||||
if (roData) {
|
||||
roData.statusHistory.push({ ... });
|
||||
}
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
## Why it's silent
|
||||
|
||||
The `completeBtn.addEventListener('click', (e) => { handleFinancialCompletion(); })`
|
||||
does NOT catch the rejected promise from the async function. The ReferenceError
|
||||
propagates as an unhandled promise rejection — which browsers log but the UI
|
||||
shows nothing. The user sees "nothing happens."
|
||||
|
||||
## Fix
|
||||
|
||||
Declare the variable OUTSIDE the `try` block:
|
||||
|
||||
```javascript
|
||||
const roData = getROData(roId); // outside try
|
||||
try {
|
||||
const servicesLines = roData?.services ? ...;
|
||||
// ...
|
||||
} catch (e) {}
|
||||
// roData is accessible here
|
||||
if (roData) { ... }
|
||||
```
|
||||
|
||||
## Detection
|
||||
|
||||
Grep for `const.*=.*try` patterns or any variable accessed after a `} catch`
|
||||
that was declared inside the `try`:
|
||||
```bash
|
||||
grep -n 'const ' file.js | while read line; do
|
||||
# Check if any const declared in try block is used after catch
|
||||
...
|
||||
done
|
||||
```
|
||||
Reference in New Issue
Block a user