如何在JavaScript中实现精化

How to implement refinement in JavaScript

本文关键字:实现 精化 JavaScript      更新时间:2023-09-26

我正在尝试用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的声明。

这样可以:http://jsfiddle.net/maniator/gxpK8/

当你按照自己的方式进行定义时:

prevOneFunc = function oneFunc(){...}

所以你没有分配一个匿名函数,所以要做你想做的事情,你必须像这样声明oneFunc

oneFunc = function() {
    document.writeln("<p> In original oneFunc() </p>");
}

后来它是正确的:

prevOneFunc = function(){...}

我会使用闭包。它避免了(另一个)全局属性,并更好地显示意图,至少对我来说是这样

// 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

不容易(真正可能的)时,唯一的情况是函数已经绑定到一些for of闭包中,或者通过不同的机制访问。

http://jsfiddle.net/tylermwashburn/6Fu8Q/

这应该是你想要的。:)

这是因为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();