如何在JavaScript中实现精化
How to implement refinement in JavaScript
我正在尝试用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();
相关文章:
- 如何使用动画实现纸张推车
- 客户端服务器REST API captcha实现
- 如何实现此布局
- Meteor忘记了密码的实现
- 使用Native Sockets在Android中实现WebSockets
- 在样板文件中实现Ajax
- instanceof是如何在JavaScript中实现的
- 如何正确实现Jquery多选小部件
- 实现一个建立在google.com之上的自定义搜索引擎
- 多个组件是如何实现的
- window.location使用jquery mobile实现chrome跳转
- 如何在OpenERP中实现网络摄像头
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- javascript加密实现,包括可信否认
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 如何让程序员在javascript中实现正确的回调
- 如何使用自定义辅助对象(handler)实现嵌套的每个循环
- AngularJS智能表全局配置实现
- Expressjs/AngularJS:实现req-flash后出错
- 如何在JavaScript中实现精化