When using reactive variables by declaring them using the $:
syntax, you get the following error.
Cannot access 'variable_name' before initialization
Here is the code:
App.svelte
<script>
import { ledzep, redhotchilis } from './data.js'
$: bandmembers = [...ledzep, ...redhotchilis]
let namesWithA = bandmembers.filter(d => {
if (d.indexOf('a') > 0) {
return true;
}
else {
return false
}
})
</script>
<h2>Band Members</h2>
<ul>
{#each bandmembers as member}
<li>{member}</li>
{/each}
</ul>
<h2>Members with "A" in their names</h2>
<ul>
{#each namesWithA as member}
<li>{member}</li>
{/each}
</ul>
data.js
export const ledzep = ["Jimmy Page", "John Bonham", "Robert Plant", "John Paul Jones"]
export const redhotchilis = ["Anthony Kiedis", "Flea", "Chad Smith", "Josh Klinghoffer"]
The "Cannot access before initialization" error occurs when a variable declared using let or const is accessed before it was initialized in the scope. To solve the error, make sure to initialize the variable before accessing it.
Lexical declarations introduce new declaration forms for defining variables using the let and const keywords. let is similar to var , but defines a variable limited in scope to the block, statement or expression in which it is used.
When you assign variables using $:
you cannot assign them as part of other variables declared using let
, const
, or var
.
When you do assignments using $:
, you can only use them in other variables assigned using $:
. In the code posted above, you need to change the following lines:
let namesWithA = bandmembers.filter(d => { if (d.indexOf('a') > 0) { return true; } else { return false } })
to the following:
$: namesWithA = bandmembers.filter(d => { if (d.indexOf('a') > 0) { return true; } else { return false } })
It took me a while to figure this out and just wanted to share this with any other Svelte newbies that are starting out in this new technology.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With