从函数全局变量

时间:2019-01-13 02:37:25

标签: javascript html5 scope html5-canvas

我的任务是在运行IE6的旧版计算机上提供实时视频供稿。为此,我使用基于Flash的填充程序来重新创建Canvas对象(IE <10中不支持)。这是自述文件:https://www.mapmsg.com/static/3rdparty/fxcanvas-0/ReadMe.html

现在,我现在这样获得imageData:

this.imageData=this.context.getImageData(0,0,this.width,this.height)

Shim文档不仅仅使用getImageData。原因是:

  

我们不能使用规范中声明的画布图像数据,因为IE使用的内存管理器效率极低,因此在某些情况下它可能会占用所有可用的内存。因此fxCanvas使用的图像数据格式略有不同。

示例:

 var cv = document.getElementById("cv");
var ctx = cv.getContext("2d");
ctx.setFillStyle("#ff0")
    .setStrokeStyle("#0ff")
    .strokeRect(10, 20, 30, 30)
    .fillRect(30, 40, 50, 50)
    .invoke("getImageData", 0, 0, cv.width, cv.height, function (imageData) {
        // ... processing image data
    });

想法是,所有图像处理都是在.invoke内部的内置函数中完成的。

所有这些,我的问题很简单。我无法在该功能中进行所有图像处理。我想将imageData返回到this.imageData中,以便在最终使用putImageData将其放回画布之前,可以在其他功能中使用它。

因此,我对此的愚蠢尝试是:

this.context.invoke("getImageData",0,0,this.width,this.height, function(imgdat){return imgdat});

this.imageData= imgdat;

不起作用。 imgdat未声明。无论我做什么,似乎都无法用this.imageData

的图像数据填充.invoke

这是我对javascript的首次体验,我正在尝试编辑未编写的代码(https://github.com/phoboslab/jsmpeg/blob/master/jsmpeg.min.js)。我非常希望将数据转换为程序已使用的格式,而不是重写所有内容以使其全部在.invoke函数中发生。

1 个答案:

答案 0 :(得分:1)

这似乎是一个简单的范围解析问题。

您会在函数内部收到imgdat,这是一个回调,但是一旦函数完成,变量就消失了。 我在第一个片段中看不到您的this.imageData

我认为您需要做的是:

var cv = document.getElementById("cv");
var ctx = cv.getContext("2d");
var self = this; // <------------ important detail
ctx.setFillStyle("#ff0")
    .setStrokeStyle("#0ff")
    .strokeRect(10, 20, 30, 30)
    .fillRect(30, 40, 50, 50)
    .invoke("getImageData", 0, 0, cv.width, cv.height, function (imageData) {
        // ... processing image data
        self.imageData = imageData; //instead of this.imageData
    });

//Now you can use imageData here.
this.imageData (...);

JavaScript中的this键盘与您在其他语言上使用的键盘不同。