修改javascript以公开函数范围的变量

时间:2016-12-15 07:04:51

标签: javascript firefox-webextensions

我希望能够公开一个函数范围的变量,它是网站的一部分(不是我的)javascript。

这是一个简单的例子:

function addHooks(e, t, n, i) {
    var props = {                    // Would like to expose this
        update: function() { ... },
        remove: function() { ... },
        find: function() { ... },
    };
    ...
}

在上面的示例中,我想公开props变量,以便我的webextension可以访问它以修改网站的行为。请注意,提供此JS文件的网站不受我的控制,因此,我不能简单地修改源文件以导出此变量。但是,我完全可以修改浏览器运行的最终代码(我只是不知道如何)。包含addHooks功能的javascript文件似乎是通过XHR动态添加的。

虽然我不知道如何以编程方式完成此操作,但我已成功设置断点,然后在浏览器的开发者控制台中发出window.siteController = props。不幸的是,手动用户干预不是我可以打包和分发的东西。

我一直在使用的一种方法是为JS文件发出AJAX请求,修改其脚本内容并将其附加到页面。

是否存在可以公开函数范围变量的规范,编程方式?

2 个答案:

答案 0 :(得分:-1)

编辑: 感谢Makyen,他指出了我的错误。 显然,如果在页面脚本中重新定义函数并将其作为脚本元素插入,则可以执行此操作。 (参见两篇参考文献的评论)。

确保在原始定义之后插入了<script>元素,然后您可以在函数末尾return props或使用this.props并将函数用作构造函数或使用call函数,传递一个将添加props属性的对象。

旧答案(__错误_显然)

简短回答:你不能。

完整的解释:如果你不能改变函数的代码而你只能使用函数(调用它)你就不能改变它的变量的范围(和好的)你也可以做到这一点。这就是变量仅限于其当前范围的原因。)

您无法更改网站的JavaScript。作为Firefox或Chrome扩展程序(可能与我不确定的其他浏览器相同),您甚至无法访问该功能(更不用说它的内部变量)。我的意思是说,你甚至无法通过网站代码中的扩展来调用它。

  

内容脚本无法查看页面脚本定义的JavaScript变量   More info and source

Firefox / Chrome在与网站环境隔离的并行环境中运行JavaScript代码。这当然是出于安全原因。它还有助于您在不知道您的代码可能被注入的每个网站的确切内部工作情况下进行开发,因为您不需要为命名冲突而烦恼(如果不是这样的话,这将是不可能的。 t为分离环境)。 您唯一可以访问的是DOM,通过它您可以收集信息,更改网站甚至在某些情况下与网站交谈(网站也应遵循您决定的协议)。

答案 1 :(得分:-1)

如果它是你想要暴露的道具对象变量,你可以从功能区返回整个对象,就像在闭包中一样。 或者,你可以,简单地将封闭函数声明为构造函数,将props设置为this.props,然后使用new关键字在其他地方调用相同的函数。 如果有帮助,请告诉我