假设我有var a = function() { return 1; }
。是否可以更改a
以便a()
返回2
?也许通过编辑a
对象的属性,因为每个函数都是一个对象?
更新:哇,谢谢大家的回复。但是,恐怕我不想简单地重新分配变量,而是实际编辑现有函数。我正在思考如何在 Scala 中结合部分函数来创建一个新的PartialFunction
. 我有兴趣在 Javascript 中编写类似的东西,并认为现有的函数可能会被更新,而不是创建一个全新的Function
对象。
假设我有var a = function() { return 1; }
。是否可以更改a
以便a()
返回2
?也许通过编辑a
对象的属性,因为每个函数都是一个对象?
更新:哇,谢谢大家的回复。但是,恐怕我不想简单地重新分配变量,而是实际编辑现有函数。我正在思考如何在 Scala 中结合部分函数来创建一个新的PartialFunction
. 我有兴趣在 Javascript 中编写类似的东西,并认为现有的函数可能会被更新,而不是创建一个全新的Function
对象。
你可以用 javascript 做各种有趣的事情,包括重新定义函数:
let a = function() { return 1; }
console.log(a()); // 1
// keep a reference
let old = a;
// redefine
a = function() {
// call the original function with any arguments specified, storing the result
const originalResult = old.apply(old, arguments);
// add one
return originalResult + 1;
};
console.log(a()); // 2
瞧。
编辑:更新以在更疯狂的场景中显示:
let 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
您可以在这里看到,即使首先定义了“test”,然后我们重新定义了 substring(),但更改仍然适用。
旁注:如果你这样做,你真的应该重新考虑你的架构......当他/他正在查看一个应该返回 1 的函数定义时,你会在 5 年后混淆一些可怜的开发人员的废话,但似乎总是返回 2....
我用这样的东西来修改一个现有的函数,它的声明对我来说是不可访问的:
// 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>
);
您可能可以使用toString()来获取包含函数声明的字符串,而不是 toSource() 。一些对 replace() 的调用准备用于函数构造函数的字符串并修改函数的源代码。
let a = function() { return 1; }
console.log(a()) // 1
a = function() { return 2; }
console.log(a()) // 2
从技术上讲,您正在丢失一个函数定义并用另一个替换它。
这个怎么样,不用重新定义函数:
var a = function() { return arguments.callee.value || 1; };
alert(a()); // => 1
a.value = 2;
alert(a()); // => 2