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;
}
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.
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.
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:
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)
}
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)
Tak. Czystszym rozwiązaniem może być zbudowanie podstawowej klasyCzy 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?
structure
i zmodyfikowanie tego, co jest INNE w każdym przypadku.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