Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态替换不在全局范围内的函数_Javascript_Jquery_Syntax - Fatal编程技术网

Javascript 动态替换不在全局范围内的函数

Javascript 动态替换不在全局范围内的函数,javascript,jquery,syntax,Javascript,Jquery,Syntax,我有一个脚本,它基于特定的场景,在最终调用原始函数之前,可能需要取代函数进行一些处理。(见“”) 一般来说,我可以做到这一点——下面是一个使用jQuery插件的基本示例(不是我想要的应用程序,只是一些快速且易于说明的东西): 当我滚动鼠标滚轮时,控制台会打印“Intercept”,滚动条会按照最初的定义移动。太好了 但是,函数名是硬编码的,不在全局范围内,因此window[]不可用(我喜欢)。是否有任何可能的黑魔法、“new Function()”和/或其他方式的组合来循环遍历函数名的潜在列表(

我有一个脚本,它基于特定的场景,在最终调用原始函数之前,可能需要取代函数进行一些处理。(见“”)

一般来说,我可以做到这一点——下面是一个使用jQuery插件的基本示例(不是我想要的应用程序,只是一些快速且易于说明的东西):

当我滚动鼠标滚轮时,控制台会打印“Intercept”,滚动条会按照最初的定义移动。太好了

但是,函数名是硬编码的,不在全局范围内,因此window[]不可用(我喜欢)。是否有任何可能的黑魔法、“new Function()”和/或其他方式的组合来循环遍历函数名的潜在列表(可能会根据其他逻辑发生变化)并以这种(或类似的精神)方式封装它们


提前谢谢

不幸的是,无法枚举或动态访问作用域对象中的成员(全局作用域/窗口对象除外)

因此,您需要重新表述一下代码。不要在外部函数中使用自由浮动函数,而是使用带有方法的对象。这将使替换这些方法更加容易

如果在开始将函数指定为事件处理程序或其他类型后修改它们,则会有一些额外的麻烦。如果您碰巧在这些函数周围使用了某种bind()包装器,那么行为的正确性将在很大程度上取决于bind()函数

具体地说,如果您希望替换方法追溯成为为任何事件处理程序或为其分配的回调调用的方法,则需要使用bind()包装器,该包装器接受上下文对象和字符串作为函数名,而不是上下文对象和函数引用。(并确保bind()不会过早解析该字符串,从而在每次调用时减少一些ms。)


如果不希望追溯行为,您仍然必须确保原始方法的某些bind()-ed版本不存在,并且在替换发生后仍用于新回调。

不幸的是,无法枚举或动态访问范围对象中的成员(全局范围/窗口对象除外)

因此,您需要对代码进行一点重新表述。与其在外部函数中使用自由浮动函数,不如使用带有方法的对象。这将使替换这些方法更加容易

如果在开始将函数指定为事件处理程序或其他类型之后修改它们,则会有一些额外的麻烦。如果您碰巧在这些函数周围使用了某种bind()包装器,那么行为的正确性将在很大程度上取决于bind()函数

具体地说,如果您希望替换方法追溯成为为任何事件处理程序或为其分配的回调调用的方法,则需要使用bind()包装器,该包装器接受一个上下文对象和一个字符串作为函数名,而不是上下文对象和函数引用不会提前解析该字符串,以便在每次通话中删除一些ms。)


如果您不希望追溯行为,您仍然必须确保原始方法的某些bind()-ed版本在替换发生后仍然在用于新回调。

公平地说,我非常感谢您的响应。值得一提的是,我的实际应用程序没有试图取代bind()-s、 因此,至少有很多疯狂并不适用;但绝对值得指出。我能够通过在init()引用的对象属性中编写over-ride函数来实现我的目标-时间;不是超级流畅的生成代码,但它完成了任务,因为没有太多的代码需要担心。公平地说,我非常感谢您的响应。值得一提的是,我的实际应用程序没有试图取代bind()-s、 因此,这种疯狂至少有很多不适用;但绝对值得指出。我能够通过在init()时引用的对象属性中编写over-ride函数来实现我的目标;这不是超级流畅的生成代码,但它完成了任务,因为没有太多需要担心的。
(function ($) {
    // Snip..

    function initalize() {
        oSelf.update();
        setEvents();
        return oSelf;
    }

    // Snip..

    function setEvents() {

        (function () {
            var oldInit = wheel;

            wheel = function (oEvent) {
                console.log('Intercept');
                oldInit(oEvent);
            }
        })();

        // Original event code, irrelevant to question
    }

    function wheel(oEvent) {
        // Actual function, related to using the mousewheel
    }

})(jQuery);