这是在您不想修改的旧 JavaScript 文件中:
// this is your original, unmodified function
function originalFunction(sel) {
alert(sel);
$(sel).css("display","none");
}
这在您的代码中:
// here is a sample callback function you pass into the extended function below
function myCallback(s) {
alert("The image with src = '" + $(s).attr("src") + "' has been modified!");
}
// here is how you can extend the function to do what you want
// without needing to modify the actual code above
originalFunction = (function(legacyFn, callback) {
// 1 arg function to be returned and reassigned to originalFunction
return function(sel) {
// call "original" originalFunction, with alert and image hide.
legacyFn(sel);
if(callback) callback(sel); // invoke your callback
}
})(originalFunction, myCallback);
变量originalFunction 被分配了一个接受一个参数的函数。接受一个参数的函数由一个接受 2 个参数的匿名自执行函数返回,即在修改之前对 originalFunction 的引用和对 callback 函数的引用。这两个函数引用在闭包内被“锁定”,因此当 originalFunction 被自执行函数分配一个新值时,legacyFn 参数在修改之前仍然包含对 originalFunction 的引用.
综上所述,在更高的层次上,originalFunction和myCallback作为参数传入自执行匿名函数并传入变量legacyFn和callback,然后将新函数分配给@987654331 @。
现在,当您调用originalFunction('.someClassOnAnImage') 时,legacyFn 将触发,这将提醒选择器并将显示属性设置为无。之后,回调函数(如果存在)将触发,然后您将看到:
The image with src = '.someClassOnAnImage' has been modified!
虽然这不如假设的或特定于平台的 addEventListener 好,但它确实允许您修改遗留代码中函数的行为,而无需物理破解打开这些文件并修改它们。这只是扩展功能以执行其他行为,但无需为此修改原始功能甚至原始文件。
您可以将所有扩展巧妙地包含在一个单独的 JavaScript 文件(或您正在使用的任何 JavaScript 文件)中,如果您想恢复原始行为,只需删除扩展函数即可。