插入JavaScript代码放到匿名函数范围

问题描述:

我有这样的脚本,我需要注入插入JavaScript代码放到匿名函数范围

! function(e) { 
    function doSomething() 
    { 
    } 
} 

基本上我去DoSomething的,当我的代码是通过函数对象调用的引用,但我需要勾到doSomething,所以我需要一个id的原始引用。由于doSomething是在匿名函数中声明的,所以我无法得到它。问题是,我可以以某种方式将代码注入匿名函数,Greesemonkey或任何其他工具的范围。

+0

“注入”是什么意思?你是否试图制作一个在特定页面上操作JS的用户脚本/浏览器扩展?是的,你可以做任何你想做的事情,但是你不能仅仅通过引用来改变'doSomething'。 – Bergi

+0

是的,我正在编写一个用户脚本,并希望与网页上的某些功能挂钩。为此,我需要将原始引用更改为匿名函数范围内的函数。 – user1617735

+0

你最好的选择是拦截脚本加载,更改它的源代码并评估它。 – Bergi

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 
+0

那么我需要钩住该范围内的函数,这意味着我仍然需要修改该函数的原始引用,因为它被该范围内的多个其他函数调用。如果我用全局函数覆盖它,我只会实现所有那些现在正在调用我的函数,但我仍然需要调用我需要钩住的原始函数。 – user1617735

+0

我列出的其他方法呢?只需在返回值中包含'doSomething'? –

+0

我无法访问内部范围,这是整个问题。 – user1617735