重写jQuery函数失去了'this'范围

时间:2019-04-02 14:04:46

标签: javascript jquery internet-explorer permission-denied sizzle

我正在尝试从另一个问题中实现以下答案:

https://stackoverflow.com/a/26469105/2402594

基本上,我需要向jQuery函数添加额外的检查。以下代码在jQuery库中:

enter image description here

但是我无法修改原始的jQuery,因此我在单独的文件中创建了补丁。我正在做的是重写find函数并添加功能,如下所示:

(function() {
var originalFind = jQuery.fn.find;

jQuery.fn.find = function () {
    try {
        document === document;
    }
    catch (err) {
        document = window.document;
    }

    return originalFind.apply(this, arguments); 
};
})();

该函数已被正确覆盖,但是,当代码调用“ find”时,我的“ try”在应有的情况下不会引发任何异常,因为作用域与Sizzle函数内部的作用域不同,因此最初的问题是还在那儿。

我还尝试过复制所有的Sizzle代码,添加修改并如上所述将其分配给jQuery.fn.find,但是范围问题仍然存在,并且会发生崩溃。

我需要先设置“文档”,然后才能进行以下检查,否则由于权限被拒绝而崩溃: enter image description here

我如何共享范围,以便可以正确完成try / catch?可能吗还有其他想法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

众所周知,JavaScript具有函数作用域:每个函数都创建一个新作用域。范围确定这些变量的可访问性(可见性)。从函数外部无法访问(可见)在函数内部定义的变量。

因此,如果文档是在JQuery库函数中定义的,那么我认为您将无法访问它。您可以尝试定义一个全局变量来存储文档,然后可以在JQuery库函数和重写函数中对其进行访问。

有关Javascript范围的更多详细信息,请检查以下链接:link1link2