Javascript: изменить значение переменной внутри условной внутри функции - PullRequest
0 голосов
/ 31 августа 2011

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

Чтобы свести его:

var func = complicated_function() {
    // lots of code
    if (something) {
        var localvar = 35;
    }
    // lots of code
}

Мне нужен localvar, чтобы быть другим номером.

Есть ли способ присвоить localvar чему-то другому, не изменяя ничего в самой функции?

Обновление: Ответ - да! Смотрите мой ответ ниже.

Ответы [ 6 ]

1 голос
/ 31 августа 2011

номер

Без изменения сложной функции нет способа, в javascript вы можете манипулировать этим, используя call и apply. Вы можете переопределить функции в сложной функции или добавить новые, если это опция (но они не смогут получить доступ к локальной переменной localvar).

это больше для забавы, мой реальный ответ до сих пор нет.

Если вы чувствуете себя сумасшедшим:)

var complicatedFunction = function() {
  var i = 10;

  var internalStuff = function() {
    console.log(i); // 10 or 12?
  };

  return internalStuff();

};

var complicatedFunction;

eval("complicatedFunction = " + complicatedFunction.toString().replace(/i = 10/, 'i = 12'));

complicatedFunction(); //# => 12
1 голос
/ 31 августа 2011

Нет, но его можно назначить условно, чтобы сигнатура функции (в основном требуемый вход и выход) не изменялась.Добавьте параметр и установите для него значение по умолчанию:

var func = complicated_function(myLocalVar) {
    // lots of code
    if (something) {
        // if myLocalVar has not been set, use 35.
        // if it has been set, use that value
        var localvar = (myLocalVar === undefined)?35:myLocalVar;
    }
    // lots of code
}
1 голос
/ 31 августа 2011

Есть ли способ присвоить localvar чему-то другому, фактически не изменяя что-либо в самой функции?

Нет.

0 голосов
/ 19 сентября 2011

Я задал этот вопрос около трех недель назад, и в течение получаса получил пять ответов, которые все в основном говорили мне, что это невозможно.

Но я рад сообщить, что ответ ДА, этоможно сделать!

Вот как:

var newfunc = func.toString().replace('35', '42');
eval('newfunc = ' + newfunc);
newfunc();

Конечно, он использует eval, что, вероятно, означает, что это зло или, по крайней мере, очень нежелательно, но в данном конкретном случае это работает.

0 голосов
/ 31 августа 2011

В JavaScript переменные «выталкиваются» на вершину своей функции. Переменные в javascript имеют область действия функции , а не область "фигурных скобок", такую ​​как C, C ++, Java и C #.

Это тот же код, который вы (разработчик) вручную выдвигаете наверх:

var func = complicated_function() {
   var localvar = 0;
   // lots of code
   if (something) {
       localvar = 35;
   }
   // lots of code
}

Помогает ли вам объявление переменной "up" в одной функции? По крайней мере, декларация изолирована.

function whatever() {
  var localvar = 0;

  var func = function() {
    var something = true;

    // lots of code
    if (something) {
        localvar = 35;
    }
    // lots of code
  };

 func();
 alert(localvar);
}
whatever();

Вот jsFiddle: http://jsfiddle.net/Gjjqx/

См. Крокфорд:

http://javascript.crockford.com/code.html

JavaScript не имеет области видимости блока, поэтому определение переменных в блоках может запутать программистов, имеющих опыт работы с другими языками семейства C. Определите все переменные в верхней части функции.

0 голосов
/ 31 августа 2011

Если функция использует this.localvar:

var func = function() {
    alert(this.localvar)
    if (true) {
        var localvar = 35;
    }
    // lots of code
    alert(this.localvar)
}
var obj = {localvar: 10}; 
func.call(obj); // alerts 10 twice

Если нет, то вы не сможете изменить ее, не изменив функцию.

...