Javascript 如何在GM_xmlhttpRequest中修复这个JS范围

Javascript 如何在GM_xmlhttpRequest中修复这个JS范围,javascript,greasemonkey,scope,Javascript,Greasemonkey,Scope,当我运行此代码时,警报2显示6个不同的href链接。警报3显示最后6次href。如何使其使用与警报2相同的对象(linkdom又名链接) 注意:这是一个greasemonkey脚本 { var linkdom = thelink; alert('2' + linkdom.getAttribute("href")); GM_xmlhttpRequest({ method: 'GET', url:

当我运行此代码时,警报2显示6个不同的href链接。警报3显示最后6次href。如何使其使用与警报2相同的对象(linkdom又名链接)

注意:这是一个greasemonkey脚本

    {
        var linkdom = thelink;
        alert('2' + linkdom.getAttribute("href"));
        GM_xmlhttpRequest({
            method: 'GET',
            url: href,
            onload: function(resp){
                //...
                alert('3' + linkdom.getAttribute("href"));
            }
        });
    //...
    }

如果这是您自己的函数,我会说将其作为参数传入。或者,如果JavaScript有默认参数,我会说将其作为默认参数传入。但现在的情况是。。。试试这个

{
    var linkdom = thelink;
    alert('2' + linkdom.getAttribute("href"));        
    GM_xmlhttpRequest({
        method: 'GET',
        url: href,
        onload: (function() { 
              var localvar = linkdom; 
              return function(resp){
                //...
                alert('3' + localvar.getAttribute("href"));
              }})()
    });
//...
}

这将创建一个外部函数,并将局部变量设置为当前值
linkdom
。然后它创建并返回您的函数。然后,我立即应用外部函数来恢复函数。外部函数不会共享相同的局部变量,因此代码应该可以工作。

如果这是您自己的函数,我建议将其作为参数传入。或者,如果JavaScript有默认参数,我会说将其作为默认参数传入。但现在的情况是。。。试试这个

{
    var linkdom = thelink;
    alert('2' + linkdom.getAttribute("href"));        
    GM_xmlhttpRequest({
        method: 'GET',
        url: href,
        onload: (function() { 
              var localvar = linkdom; 
              return function(resp){
                //...
                alert('3' + localvar.getAttribute("href"));
              }})()
    });
//...
}

这将创建一个外部函数,并将局部变量设置为当前值
linkdom
。然后它创建并返回您的函数。然后,我立即应用外部函数来恢复函数。外部函数不会共享相同的局部变量,因此代码应该可以工作。

我以前见过这种模式,除了
linkdom
作为参数传递给内联函数,而不是让内联函数关闭它。这两者有什么区别吗?我不确定。我认为效果是一样的——创建一个局部变量,其中包含您想要的内容。这种方式对我来说更清楚一些,因为您可以更清楚地看到
localvar
中的内容。我以前见过这种模式,除了
linkdom
作为参数传递给内联函数,而不是让内联函数关闭它。这两者有什么区别吗?我不确定。我认为效果是一样的——创建一个局部变量,其中包含您想要的内容。这种方式对我来说更清晰,因为您可以更清楚地看到
localvar
中的内容