代码之家  ›  专栏  ›  技术社区  ›  trueCamelType

为什么我不能从chrome.downloads.onchanged内部调用函数?

  •  1
  • trueCamelType  · 技术社区  · 6 年前

    我是第一次在Chrome中创建一个扩展(我不是Web或JavaScript开发人员)。我在一个代码库中添加了一个我从未使用过的旧版本的javascript(一旦我在一台使用该代码库的计算机上,我会标记它是哪个版本,但我记不起来)。

    我有一个叫做DownloadManager的班级,在里面我打电话给 chrome.downloads.onChanged 在它里面,我调用了类内部的另一个函数,但是它不能识别类(我认为这就是问题所在)。

    // Class named DownloadManager
    function DownloadManager(someData) {
    
        this._myData = someData;
    
        // function that does a thing, and tests run successfully
        this.doAThing = function(someData) {
            // Code in here that we assume works, and there's no issues.
        }
    
        if(chrome.downloads) {
            chrome.downloads.onChanged.addListener(function(delta) {
                // Error here
                this.doAThing(delta.data);
            }
        }
    }
    

    我犯的错误是 this.doAThing(this._myData); 线。错误是 Error in event handler for downloads.onChanged: TypeError: Cannot read property 'doAThing' of null at <URL> .

    我假设这是一个范围问题,而且 this. 这不代表什么,也不能进入 doAThing 在那里。我确信接受的参数与上面声明的函数类型相同。

    当我回到那个环境时,我会添加更多的数据。

    1 回复  |  直到 6 年前
        1
  •  1
  •   The Muffin Man    6 年前

    在事件处理程序中 chrome.downloads.onChanged 这个 this 关键字现在的上下文与 DownloadManager . 由于您在 downloadManager 您可以共享这个变量,但这恰好是“定义代码的位置与调用代码的位置”的巧合。

    你也许可以通过分配 到主作用域中的变量:

    function DownloadManager(someData) {
        this.doAThing = function(someData) {
            // Code in here that we assume works, and there's no issues.
        }
    
        window.myScope = this;
    
        if(chrome.downloads) {
            chrome.downloads.onChanged.addListener(function(delta) {
                // Error here
                window.myScope.doAThing(delta.data);
            }
        }
    }