插入JavaScript代码放到匿名函数范围
我有这样的脚本,我需要注入插入JavaScript代码放到匿名函数范围
! function(e) {
function doSomething()
{
}
}
基本上我去DoSomething的,当我的代码是通过函数对象调用的引用,但我需要勾到doSomething,所以我需要一个id的原始引用。由于doSomething是在匿名函数中声明的,所以我无法得到它。问题是,我可以以某种方式将代码注入匿名函数,Greesemonkey或任何其他工具的范围。
Javascript并不容易从范围内获取值。
您可以在更广的范围内声明doSomething
:
function doSomething() {
// ...
}
function func(e) {
doSomething(); // This works! `func` has a reference to `doSomething`
}
doSomething(); // This also works! `doSomething` is declared in this scope.
您还可以从内部范围的返回值!例如:
function func(e) {
function doSomething() {
// ...
}
// Note that we are not invoking `doSomething`, we are only returning a reference to it.
return doSomething;
}
var doSomething = func(/* some value */);
// Now you got the reference!
doSomething();
有时已经需要返回另一个值你的外在功能:
function func(e) {
function doSomething() { /* ... */ }
return 'important value!!';
}
在这种情况下,我们仍然可以返回doSomething
,与原来的值一起:
function func(e) {
function doSomething() { /* ... */ }
return {
value: 'important value',
doSomething: doSomething
};
}
var funcResult = func(/* some value */);
var originalValue = funcResult.value;
var doSomething = funcResult.doSomething;
// Now we have the original value, AND we have access to `doSomething`:
doSomething(); // This works
那么我需要钩住该范围内的函数,这意味着我仍然需要修改该函数的原始引用,因为它被该范围内的多个其他函数调用。如果我用全局函数覆盖它,我只会实现所有那些现在正在调用我的函数,但我仍然需要调用我需要钩住的原始函数。 – user1617735
我列出的其他方法呢?只需在返回值中包含'doSomething'? –
我无法访问内部范围,这是整个问题。 – user1617735
“注入”是什么意思?你是否试图制作一个在特定页面上操作JS的用户脚本/浏览器扩展?是的,你可以做任何你想做的事情,但是你不能仅仅通过引用来改变'doSomething'。 – Bergi
是的,我正在编写一个用户脚本,并希望与网页上的某些功能挂钩。为此,我需要将原始引用更改为匿名函数范围内的函数。 – user1617735
你最好的选择是拦截脚本加载,更改它的源代码并评估它。 – Bergi