问题是这些功能似乎无法互相看见。
例如:
unsafeWindow.helloworld = function() {
alert('Hello world!');
helloworld2();//fails with error saying it does not exist
}
unsafeWindow.helloworld2 = function() {
alert('Hello world!2');
helloworld();//fails with error saying it does not exist
}
insert("helloworld();"); //appends a script element to the body
这两个函数都可以使用insert或firebug控制台调用,但是他们内部不了解彼此吗?这有什么问题?
答案 0 :(得分:1)
如果您格式化代码,那将会有很大帮助:
> unsafeWindow.helloworld = function() {
>
> alert('Hello world!');
>
> // fails with error saying it does not exist
> helloworld2();
> }
>
> unsafeWindow.helloworld2 = function() {
>
> alert('Hello world!2');
>
> //fails with error saying it does not exist
> helloworld();
>
> }
你有无限递归函数 - helloworld 调用 helloworld2 ,它调用 helloworld ,所以 ad无限。< / p>
但无论如何,您设置的属性为unsafeWindow
:
unsafeWindow.helloworld = function() {
但后来尝试使用在作用域链上解析的非限定标识符来调用它:
[... later, in helloword2 ...]
helloworld();
因此,在调用helloworld
时创建的执行/变量对象的范围链上解析标识符unsafeWindow.helloworld2
。
因此helloworld
设置为unsafeWindow
的属性。调用该函数时,将使用函数的范围链解析标识符helloworld2
。
在浏览器中,窗口/全局对象位于作用域链上,因此可以在那里找到变量名称(即,如果在作用域链中没有找到变量,则变量可以解析为全局对象的属性),但我怀疑当{调用{1}},其范围链以文档的全局对象结束,而不是unsafeWindow.helloworld
。否则对文档中函数的调用也会在其作用域链上有unsafeWindow
,这对我来说似乎不对。
或者我可能完全错了。 : - )
答案 1 :(得分:1)
存在多个问题。
由于函数是在unsafeWindow
范围内定义的,因此必须在Greasemonkey脚本中以这种方式调用它们。
像这样:
unsafeWindow.helloworld = function () {
alert ('Hello world!');
unsafeWindow.helloworld2 ();
}
unsafeWindow.helloworld2 = function () {
alert ('Hello world!2');
unsafeWindow.helloworld ();
}
insert()
来自哪里?!要调用这些函数,您可以使用:
// WARNING this will launch an infinite loop!!
unsafeWindow.helloworld2 ();
不要这样做!以这种方式定义函数的唯一原因是覆盖/覆盖目标页面上已有的函数。在极少数情况下,当您想要覆盖网站的JavaScript时,最好的方法取决于细节。
您可以使用许多unsafeWindow
转义(如图所示)或rewrite functions en masse,但最好的方法通常只是删除页面的功能:
(unsafeWindow.badFunc = function () {}
)
并在GM脚本范围中替换/添加更改的功能。
但对于目前发布的问题,您无需执行任何操作。根据显示的内容,脚本将是:
helloworld = function () {
alert ('Hello world!');
helloworld2 ();
}
helloworld2 = function () {
alert ('Hello world!2');
helloworld ();
}
// WARNING this will launch an infinite loop!!
helloworld2 ();