【发布时间】:2013-01-11 16:45:29
【问题描述】:
当我在 JavaScript 中编写函数包装器(例如:throttle 或 debounce 函数)时,我希望能够检查“装饰”函数并且仍然能够知道底层函数是什么。以throttle 的实现为例:
function throttle(fn, time) {
var handle;
var execute = function() {
handle = null;
fn.apply(this, arguments);
};
var throttled = function() {
if(!handle) {
handle = setTimeout(execute.bind(this), time);
}
};
throttled.toString = function() {
return fn.toString() + "\n// throttled to " + time + "ms";
};
return throttled;
}
var makeAjax = throttle(function(callback) {
$.getJSON("/path", callback);
}, 500);
console.log(makeAjax);
console.log 呼叫显示:
function (callback) {
$.getJSON("/path", callback);
}
// throttled to 500ms
作为throttle 的用户,我更关心我赋予它的功能,而不是其内部throttled。
但是,在覆盖原生函数时,我总是感到有些不安。在执行此操作时,我是否应该担心任何合规性和/或性能问题?
【问题讨论】:
-
隐式转换可能是个问题。但是您可能不会遇到隐式强制转换函数的情况。
-
任何会调用
fn.toString()的东西要么用于日志记录,要么用于动态重新编译,所以我认为你会很好。特别是因为您没有覆盖Function.prototype.toString。 -
@Esailija 动态重新编译是什么意思?
-
@RenatoZannon 通过
.toString()读取函数体,修改它,eval结果。这不是任何正常的事情,所以不要担心。它可以用于元编程。
标签: javascript function overloading