Можно ли изменить функцию JavaScript после объявления его?

Скажем, я имею var a = function() { return 1; }. Действительно ли возможно измениться a так, чтобы a() возвраты 2? Возможно, путем редактирования свойства a объект, так как каждая функция является объектом?

Обновление: Ничего себе, спасибо за все ответы. Однако я боюсь, что не надеялся просто повторно присваивать переменную, но на самом деле редактировать существующую функцию. Я думаю вроде того, как можно объединить частичные функции в Scala для создания нового PartialFunction. Я интересуюсь в письменной форме что-то подобное JavaScript и думал, что существующая функция могла, возможно, быть обновлена, вместо того, чтобы создать совершенно новое Function объект.

59
задан pr1001 26 January 2010 в 21:40
поделиться

7 ответов

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

var a = function(){ return 1; }

alert(a()); //1

// keep a reference
var old = a;

// redefine
a = function(){
  // call the original function with any arguments specified, storing the result
  var originalResult = old.apply(old, arguments);
  // add one
  return originalResult + 1;
};
alert(a()); //2

VOILA.

Редактировать: Обновлено, чтобы показать это в Crazier Сценарий:

var test = new String("123");
console.log(test.toString()); // logs 123
console.log(test.substring(0)); // logs 123
String.prototype.substring = function(){ return "hahanope"; }
console.log(test.substring(0)); // logs hahanope

Вы можете увидеть здесь, что, хотя «тест» определяется первым, и мы переопределяем подстроку () после этого, изменение по-прежнему применяется.

Сбочная Примечание. Вы действительно должны пересмотреть свою архитектуру, если вы делаете это ... вы собираетесь запутать дерьмо из некоторых бедных разработчиков 5 лет вниз по дороге, когда он / она смотрит на определение функции, которое предполагается Чтобы вернуться 1, но, кажется, всегда возвращается 2 ....

40
ответ дан 24 November 2019 в 18:10
поделиться
var a = function() { return 1; }
alert(a()) // 1
a = function() { return 2; }
alert(a()) // 2

Технически вы теряете одно определение функции и заменив ее другим.

22
ответ дан 24 November 2019 в 18:10
поделиться

Как насчет этого, без необходимости переопределить функцию:

var a = function() { return arguments.callee.value || 1; };
alert(a()); // => 1
a.value = 2;
alert(a()); // => 2
15
ответ дан 24 November 2019 в 18:10
поделиться

Вы не можете просто определить его снова позже? Когда вы хотите изменения, попробуйте просто переопределить его как:

a = function() { return 2; }
0
ответ дан 24 November 2019 в 18:10
поделиться

Если вы отладки JavaScript и хотите посмотреть, как изменения в коде влияют на страницу, вы можете использовать это расширение Firefox для просмотра / изменения Javascripts:

Выполнить расширение JS Firefox: https://addons.mozilla.org/en-us/firefox/addon/1729

0
ответ дан 24 November 2019 в 18:10
поделиться

Абсолютно. Просто назначайте ему новую функцию.

-1
ответ дан 24 November 2019 в 18:10
поделиться

Я использовал что-то подобное, чтобы изменить существующую функцию, чья декларация не была доступна для меня:

// declare function foo
var foo = function (a) { alert(a); };

// modify function foo
foo = new Function (
  "a",
  foo.toSource()
    .replace("alert(a)", "alert('function modified - ' + a)")
    .replace(/^function[^{]+{/i,"")  // remove everything up to and including the first curly bracket
    .replace(/}[^}]*$/i, "")  // remove last curly bracket and everything after<br>
);

вместо Tosource () вы, вероятно, используете TOSTRING () Получите строку, содержащую декларацию функции. Некоторые вызовы для замены () для приготовления строки для использования с конструктором функций и изменение источника функции.

40
ответ дан 24 November 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: