Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot access 'variable_name' before initialization

Tags:

svelte

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"]
like image 831
ivan quintero Avatar asked May 27 '19 00:05

ivan quintero


People also ask

Can not access before initialization?

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.

What is lexical declaration?

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.


1 Answers

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.

like image 131
ivan quintero Avatar answered Sep 22 '22 17:09

ivan quintero