zakres zmiennej javascript w instrukcji IF

Czy zmienne zadeklarowane i przypisane w instrukcji " if "są widoczne tylko w tym bloku" if " lub w całej funkcji?

Czy robię to dobrze w poniższym kodzie? (wydaje się działać, ale wielokrotne deklarowanie "struktury var" wydaje się niezręczne) jakieś czystsze rozwiązania?

    function actionPane(state) {
    if(state === "ed") {
        var structure = {
            "element" : "div",
            "attr" : {
                "class" : "actionPane"
            },
            "contains" : [{
                "element" : "a",
                "attr" : {
                    "title" : "edit",
                    "href" : "#",
                    "class" : "edit"
                },
                "contains" : ""
            }, {
                "element" : "a",
                "attr" : {
                    "title" : "delete",
                    "href" : "#",
                    "class" : "delete"
                },
                "contains" : ""
            }]
        }
    } else {
        var structure = {
            "element" : "div",
            "attr" : {
                "class" : "actionPane"
            },
            "contains" : [{
                "element" : "a",
                "attr" : {
                    "title" : "save",
                    "href" : "#",
                    "class" : "save"
                },
                "contains" : ""
            }, {
                "element" : "a",
                "attr" : {
                    "title" : "cancel",
                    "href" : "#",
                    "class" : "cancel"
                },
                "contains" : ""
            }]
        }
    }
    return structure;
}
Author: Lightness Races in Orbit, 2011-08-06

5 answers

1) zmienne są widoczne dla całego zakresu funkcji . Dlatego należy je zadeklarować tylko raz.

2) nie powinieneś deklarować zmiennej dwa razy w swoim przykładzie. Polecam zadeklarować zmienną u góry funkcji, a następnie po prostu ustawić wartość później:

function actionPane(state) {
    var structure;
    if(state === "ed") {
        structure = {    
            ...

Aby uzyskać doskonałe opinie na temat JavaScript, Gorąco polecam użycie JSLint autorstwa Douglasa Crockforda. Zeskanuje Twój kod w poszukiwaniu typowych błędów i znajdzie sugestie dotyczące sprzątanie.

Polecam również lekturę małej książki JavaScript: the Good Parts. Zawiera wiele wskazówek dotyczących pisania kodu JS.

 37
Author: OverZealous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:45

JavaScript nie ma "zakresu blokowego", ma tylko zakres funkcji - więc zmienne zadeklarowane wewnątrz instrukcji if (lub dowolnego warunkowego bloku) są "podnoszone"do zewnętrznego zakresu.

if(true) {
    var foo = "bar";
}
alert(foo); // "bar"
To rzeczywiście maluje jaśniejszy obraz (i pojawia się w wywiadach, z doświadczenia:))]}
var foo = "test";
if(true) {
    alert(foo); // Interviewer: "What does this alert?" Answer: "test"
    var foo = "bar";
}
alert(foo); // "bar" Interviewer: Why is that? Answer: Because JavaScript does not have block scope

Zakres funkcji, w JavaScript, zazwyczaj odnosi się do zamknięć.

var bar = "heheheh";
var blah = (function() {
    var foo = "hello";
    alert(bar); // "heheheh"
    alert(foo); // "hello" (obviously)
});

blah(); // "heheheh", "hello"
alert(foo); // undefined, no alert

Wewnętrzny zakres funkcji ma dostęp do środowiska, w którym jest zawarta, ale nie w inny sposób w pobliżu.

Aby odpowiedzieć na drugie pytanie, optymalizację można osiągnąć, początkowo konstruując "minimalny" obiekt, który spełnia wszystkie warunki, a następnie zwiększając lub modyfikując go w oparciu o określone warunki, które zostały / zostały spełnione.

 35
Author: karim79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-06 05:32:35

ECMAScript 2015 (ES6) zawiera dwa nowe słowa kluczowe, które ostatecznie pozwalają JavaScript na wykonywanie właściwego zakresu blokowego bez konieczności stosowania obiegowej, potocznej składni:

  1. niech
  2. const
 3
Author: TheDarkIn1978,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-25 12:15:11

Zmienne zadeklarowane wewnątrz instrukcji if będą dostępne tak długo, jak długo znajdują się w tej samej funkcji.

W Twoim przypadku najlepiej byłoby zadeklarować strukturę, a następnie zmodyfikować części obiektu, które różnią się w obu przypadkach:

var structure = {
    "element" : "div",
    "attr" : {
        "class" : "actionPane"
    },
    "contains" : [{
        "element" : "a",
        "attr" : {
            "title" : "edit",
            "href" : "#",
            "class" : "edit"
        },
        "contains" : ""
    }, {
        "element" : "a",
        "attr" : {
            "title" : "delete",
            "href" : "#",
            "class" : "delete"
        },
        "contains" : ""
    }]
}

if(state != "ed") {
    // modify appropriate attrs of structure (e.g. set title and class to cancel)
}
 2
Author: Eric Conner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-06 05:07:46

Są zmiennymi zadeklarowanymi i przypisanymi w instrukcji" if " widocznymi tylko w tym bloku "Jeśli" czy w całej funkcji?

W Javascript wszystkie zmienne są albo

  • zasięg globalny
  • local scope (whole function) - Javascript nie ma "Block scope", gdzie zmienne są dostępne tylko z mniejszym blokiem lokalnego scope (function)

Czy robię to dobrze w poniższym kodzie? (wydaje się działać, ale wielokrotne deklarowanie "struktury var" wydaje się akward) każdy czyściciel rozwiązania?

Tak. Czystszym rozwiązaniem może być zbudowanie podstawowej klasy structure i zmodyfikowanie tego, co jest INNE w każdym przypadku.
 2
Author: foxy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-06 05:07:46