Странное поведение JavaScript, изменение значения переменной перед вызовом функции конвертера - PullRequest
3 голосов
/ 13 сентября 2011

Я передаю некоторые данные JSON от Smarty.Я применяю это к переменной JavaScript, options.

Если вы видели мой предыдущий вопрос о форматах дат, вы знаете, что мне нужно немного поработать над поступающими данными, поэтомуУ меня есть функция с именем chart_convert_dates(), которая вызывается, передавая параметры (ну, options.data), и по возвращении возвращая ее обратно.

Если вы прочитаете мой код, вы заметитеЯ отлаживаю переменную options, и она меняется от исходной до , когда вызывается функция!?

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

Это происходит с Chrome, FF ... что происходит?

{literal}

    <script type="text/javascript">

        $(document).ready(function() {

            // set JS var, this data is coming in from smarty
            var options = {/literal}{$options}{literal};

            // these should both be exactly the same
            debug.debug({/literal}{$options}{literal});
            debug.debug(options);

            // but the above outputs aren't the same! options has been modified
            // by the function below... that hasn't even fired yet!? We can prove
            // this by commenting out the following function call

            options.data = chart_convert_dates(options.data);

            // ... do something else

        });

    </script>

{/literal}

1 Ответ

2 голосов
/ 13 сентября 2011

Это, конечно, невозможно.

Вы, вероятно, обнаружите, что функция debug.debug() сохраняет ссылку на объект, которому она предоставлена, вместо того, чтобы немедленно преобразовать ее в строку.Когда вы затем просмотрите содержимое его аргумента в более позднее время , выходные данные будут отражать текущее состояние объекта, а не состояние, в котором оно было в.

Это лучше всего объяснить на следующем примере:

var debug = {
    report: function () {
        // console.log(this._value);
    },
    debug: function (arg) {
        this._value = arg; // save a reference
    }
}

var options = {
    foo: 1
};

debug.debug(options);

options.foo = 2;

debug.report(); // will show 2 (http://jsfiddle.net/zQFPm/)

http://jsfiddle.net/zQFPm/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...