Скажем, я имею var a = function() { return 1; }
. Действительно ли возможно измениться a
так, чтобы a()
возвраты 2
? Возможно, путем редактирования свойства a
объект, так как каждая функция является объектом?
Обновление: Ничего себе, спасибо за все ответы. Однако я боюсь, что не надеялся просто повторно присваивать переменную, но на самом деле редактировать существующую функцию. Я думаю вроде того, как можно объединить частичные функции в Scala для создания нового PartialFunction
. Я интересуюсь в письменной форме что-то подобное JavaScript и думал, что существующая функция могла, возможно, быть обновлена, вместо того, чтобы создать совершенно новое Function
объект.
Вы можете делать все виды забавных вещей с помощью 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 ....
var a = function() { return 1; }
alert(a()) // 1
a = function() { return 2; }
alert(a()) // 2
Технически вы теряете одно определение функции и заменив ее другим.
Как насчет этого, без необходимости переопределить функцию:
var a = function() { return arguments.callee.value || 1; };
alert(a()); // => 1
a.value = 2;
alert(a()); // => 2
Вы не можете просто определить его снова позже? Когда вы хотите изменения, попробуйте просто переопределить его как:
a = function() { return 2; }
Если вы отладки JavaScript и хотите посмотреть, как изменения в коде влияют на страницу, вы можете использовать это расширение Firefox для просмотра / изменения Javascripts:
Выполнить расширение JS Firefox: https://addons.mozilla.org/en-us/firefox/addon/1729
Я использовал что-то подобное, чтобы изменить существующую функцию, чья декларация не была доступна для меня:
// 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 () Получите строку, содержащую декларацию функции. Некоторые вызовы для замены () для приготовления строки для использования с конструктором функций и изменение источника функции.