我正在尝试编写一个与弹出窗口和JS一起使用的浏览器扩展。在JS的某一点上,我想从活动选项卡中获取一些数据并将其记录在变量中以供以后使用,所以我这样做:
var theData;
function recordData(obtainedData) {
theData = obtainedData;
}
browser.tabs.executeScript({
code: 'document.getElementById("theData").innerHTML'
}, (results) => {
recordData(results[0]);
});
如您所见,recordData
的唯一目的是将数据记录在theData
中。但是,由于某种原因,这种情况不会发生,并且函数theData
中的recordData
似乎被视为局部变量。因为如果执行以下操作,我会得到:
var theData;
alert(theData); // alerts "undefined"
function recordData(obtainedData) {
alert(theData); // alerts "undefined"
theData = obtainedData;
alert(theData); // alerts obtainedData
}
browser.tabs.executeScript({
code: 'document.getElementById("theData").innerHTML'
}, (results) => {
recordData(results[0]);
});
alert(theData); // alerts "undefined" (obtainedData didn't get recorded)
首先,我认为这将是一个范围问题。我已经尝试过使用browser.theData
之类的方法,但是没有帮助。但是,如果我在单独的,独立的,非扩展的JS中尝试相同的原理(首先声明一个变量,然后使用一个函数对其进行修改,最后检查其值),则它工作得很好,并且即使在执行从函数返回。
所以现在我想这可能更多是由于制表符和扩展名相互作用的某些特殊性。但是,由于我只是刚刚开始涉足这一领域,所以我对问题的根源在哪里以及如何解决这个问题还没有真正的想法。任何建议将不胜感激。
更新-解决方案:
尽管我不确定如何运行,但毕竟还是可以。我在此处发布的代码段是一个较大的JS文件的一部分。他们确实按照我在这里发布的顺序进行了跟进,但是也有其他代码(即使与此无关)。通过以下方式重新排列代码片段:
variable declaration - right at the start of the JS file
definition of function recordData - right after variable declaration
[other code]
browser.tabs.executeScript(...) - at the very end of the JS file
...现在可以使用。尽管我仍然不确定导致问题的原因,但正如我所说的那样,其他代码无关,声明的顺序-函数定义-函数调用也没有改变。