这是一个想法:我希望能够做到这一点,以便我可以改变函数中输入的顺序。让我们说正常函数看起来像这样:
var f = function(a,b,c,d){
return a * b / c + d;
}
我希望能够重新定义该函数,以便当用户调用f(w,x,y,z)
时,如果变量(假设为changed
)为真,则其行为就像用户调用{{1} }! (具体不是相反的顺序,只是与原始函数不同的顺序)
如果我想编写一个单独的函数,我可以执行以下操作:
f(w,z,y,x)
然后用var newF = function(a,b,c,d){
if(changed === true){
return f(c,d,b,a);
}
else{
return f(a,b,c,d);
}
}
次来电替换所有f
次来电,但这不是我要问的。
是否可以重新定义与实际功能同名的功能,以及如何完成?如果我不能,请解释原因。
我想要这样做的原因是因为我有一个应用程序,它具有使一切自然发声的功能(如直线中的点是直的),但如果我切换一些值,它会创建一个有趣,不切实际的,情况,我认为这将是一个有趣的选择实施。我上面的选项是可行的,我可以使用它,但我只是想知道是否可以将它保持在相同的函数名称中
答案 0 :(得分:4)
是否可以重新定义与实际功能同名的功能,以及如何完成?
是的,你可以再次分配给它的标识符:
f = function(a,b,c,d) {
if (changed)
return a * d / c + b;
else
return a * b / c + d;
};
如果你需要调用实际函数,因为你不完全知道它的内容(但是想拦截它的参数),你可以这样做
f = (function(oldF) {
return function(a,b,c,d){
if (changed)
return oldF(c,d,b,a);
else
return oldF(a,b,c,d);
};
})(f);
答案 1 :(得分:2)
var oldF = f;
f = function( ... ){
// do stuff
oldF(...);
};
答案 2 :(得分:1)
使用在运行时返回正确函数的工厂方法。
答案 3 :(得分:0)
好的,首先,只要您定义了这样的函数:
var f = function(...){...};
然后你可以轻松覆盖它。但是当你这样做时:
function f(...){...}
解释简单地说,当你用function f(...){...
声明函数时,编译器将首先查找每个声明的函数然后运行你的代码。另一方面,声明为变量f将在运行期间而不是在预处理期间存储函数。
因此声明如下:
function f(){
console.log('a');
};
f();
function f(){
console.log('b');
}
f();
将输出b b
,fiddle
像这样:
var f = function () {
console.log('a');
};
f();
f = function () {
console.log('b');
}
f();
将输出a b
,fiddle
现在,我从未将参数放在示例中,因为JS不关心类型和参数大小。 imo的最佳方式是这样做:
var myProject = {};
myProject.fn = {
f: function(args,options){
//in your case while you need a,b,c,d you can use the args array to store them
//options to define the 'changed' thing or whatever you need
}
}
答案 4 :(得分:0)
除了“你为什么要这样做”之外,你可以这样做:
var changed = false;
var f = function(a,b) {
console.log("original function: " + a + "," + b);
}
f = (function(original) {
return function(a,b) {
console.log("new function");
if (changed) {
console.log("order changed");
original(b,a);
}
else {
original(a,b);
}
}
})(f);
f(1,2);
changed = true;
f(1,2);
将输出(在控制台中):
new function
original function: 1,2
new function
order changed
original function: 2,1