我正在尝试实现(所以说)JavaScript中的改进。请看以下示例:
<html>
<head>
<title>Function Override (Refinement) example</title>
<script type="text/javascript">
// original function
function oneFunc() {
document.writeln("<p> In original oneFunc() </p>");
}
var prevOneFunc = null;
if (oneFunc) {
prevOneFunc = oneFunc;
}
// redeclared function (should refine/complement the original one)
function oneFunc() {
if (prevOneFunc) {
prevOneFunc(); // should call original oneFunc(), BUT IT ISN'T
}
document.writeln("<p> In refined oneFunc() </p>");
}
oneFunc();
</script>
</head>
<body>
</body>
</html>
我的意图是打印两次:
In original oneFunc() In refined oneFunc()
但是,似乎因为在执行时 oneFunc
引用了新的/精炼函数,因此输出与预期不同。在调试器中检查我正在进入无限递归:)(是的,完全理解为什么)。
请说明我缺少哪些信息才能正确实施。
更新:一些限制:我认为(不确定)我无法修改原始oneFunc
声明,并且声明如上所述。我不应该修改精炼oneFunc
的声明。
答案 0 :(得分:2)
这有效:http://jsfiddle.net/maniator/gxpK8/
按照您定义的方式进行操作时:
prevOneFunc = function oneFunc(){...}
所以你没有分配一个匿名函数,因此要做你想做的事,你必须像这样声明oneFunc
:
oneFunc = function() {
document.writeln("<p> In original oneFunc() </p>");
}
后来就是正确的:
prevOneFunc = function(){...}
答案 1 :(得分:1)
我会使用一个闭包。它避免了(另一个)全局属性并且更好地显示了意图,至少对我而言。
// original function
function oneFunc() {
return "world"
}
alert(oneFunc)
oneFunc = (function (original) {
// a closure will prevent the original function -- which is an object
// from ever being lost
return function () {
alert("before");
var ret = original()
alert("after")
return "hello " + ret
}
})(oneFunc)
alert(oneFunc)
快乐编码
评论:
完全相同。函数是只是对象。唯一的“技巧”是确保别人调用你的对象。如果该函数是属性(如所示代码中所示),则很容易:
window.somefunc = myfunc
someobj.somefunc = myfunc
不容易(真的可能)的唯一情况是当某个函数被绑定到某个闭包或以其他方式通过不同的机制访问时。
答案 2 :(得分:1)
http://jsfiddle.net/tylermwashburn/6Fu8Q/
那应该做你想要的。 :)
答案 3 :(得分:0)
这是因为JavaScript提升。 http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
试试这个:
var oneFunc = function(){
//In original oneFunc
};
var prevOneFunc = null;
if (oneFunc) {
prevOneFunc = oneFunc;
}
oneFunc = function(){
//In refined oneFunc
};
oneFunc();