область видимости переменной javascript в операторе IF - PullRequest
47 голосов
/ 06 августа 2011

Переменные, объявленные и назначенные в операторе if, видимы только в этом блоке if или во всей функции?

Правильно ли я делаю это в следующем коде? (кажется, работает, но объявление "структуры var" несколько раз кажется неудобным) какие-нибудь более чистые решения?

    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 ]

45 голосов
/ 06 августа 2011

1) Переменные видны для всей области действия функции . Поэтому вы должны объявить их только один раз.

2) Вы не должны объявлять переменную дважды в вашем примере. Я бы порекомендовал объявить переменную в верхней части функции, а затем просто установить значение позже:

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

Для получения отличных отзывов о JavaScript я настоятельно рекомендую использовать JSLint от Douglas Crockford. Он просканирует ваш код на наличие распространенных ошибок и найдет предложения по очистке.

Я также рекомендую прочитать маленькую книгу JavaScript: Хорошие части . Он содержит множество советов по написанию поддерживаемого кода JS.

40 голосов
/ 06 августа 2011

JavaScript не имеет «области видимости блока», он имеет только область действия функции - поэтому переменные, объявленные внутри оператора if (или любого условного блока), «поднимаются» во внешнюю область.

if(true) {
    var foo = "bar";
}
alert(foo); // "bar"

Это на самом делерисует более четкую картину (и появляется на собеседованиях из опыта :))

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

Область действия функции в JavaScript обычно относится к замыканиям.

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

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

Внутренняя область действия функцииимеет доступ к среде, в которой он содержится, но не наоборот.

Чтобы ответить на ваш второй вопрос, можно достичь оптимизации, сначала создав «минимальный» объект, который удовлетворяет всем условиям, а затем увеличивая или увеличиваяизменение его на основе определенных условий, которые были / были выполнены.

3 голосов
/ 25 июня 2016

ECMAScript 2015 (ES6) включает два новых ключевых слова, которые, наконец, позволяют JavaScript выполнять правильную область видимости блока без необходимости использовать обходной, разговорный синтаксис:

  1. let
  2. const
2 голосов
/ 06 августа 2011

- это переменные, объявленные и назначенные в операторе "if", видимые только в этом блоке "if" или во всей функции?

В Javascript все переменные либо

  • глобальная область
  • локальная область ( вся функция) - Javascript не имеет "области видимости блока", где переменные доступны только с меньшим блоком локальной области видимости(функция)

правильно ли я делаю это в следующем коде?(кажется, работает, но объявление «структуры var» несколько раз кажется неудобным) Есть ли более чистые решения?

Да.Более чистое решение может заключаться в создании базового класса structure и изменении того, что отличается в каждом случае.

2 голосов
/ 06 августа 2011

Переменные, объявленные внутри оператора if, будут доступны outisde, если они находятся в одной и той же функции.

В вашем случае лучшим способом было бы объявить структуру и затем изменить части объекта, которые отличаются в любом случае:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...