如何更改对先前作用域中的对象的引用的函数

How to change a function that has references to objects in a previous scope

本文关键字:对象 引用 函数 作用域 何更改      更新时间:2023-09-26

我想替换函数的代码,但它在另一个范围内有引用。我不确定我是否使用了正确的术语,因此代码可以更好地解释这一点。

RenderEngineWebGL = (function () {
//code that creates textCanvas somewhere here
    re.createTextTexture = function(textureId, fontName, 
          size, color, text, outlineSize, outlineColor) {
...
...
    var ctx = textCanvas.getContext('2d');
    ctx.save();
    ctx.font = fontString;
    ctx.textBaseline = 'top';
    }
...
return re;
}());

我试图通过将RenderEngineWebGL.createTextTexture更改为我希望函数的工作方式来编辑它。

RenderEngineWebGL.createTextTexture = function(textureId, fontName, 
          size, color, text, outlineSize, outlineColor) {
    ...
    ...
    console.log(text);//Whatever I Want
    size = 50;        //to change here

    var ctx = textCanvas.getContext('2d');
    ctx.save();
    ctx.font = fontString;
    ctx.textBaseline = 'top';
    }

这不起作用,因为 textCanvas 不是在该范围之外定义的。我通过使用 chrome 扩展程序并用我的代码替换整个代码暂时解决了这个问题,但是当代码更新时,我必须手动将这些编辑放回去。

textCanvas 不是唯一的问题,因此找到该 canvas 将无济于事。还有其他导致错误的参考资料,我没有包括在内。

如果我能够编辑此函数而不必替换脚本其余部分中的所有代码,那么我唯一需要更新它的时间是当我更改的部分已更改时。

如何更改引用 textCanvas 等对象的函数?

您不能在匿名函数之外访问 textCanvas,因为它在词法上绑定到该函数范围。您唯一的选择是更改RenderEngineWebGL ,以便其他范围可以访问textCanvas。例如,您可以在RenderEngineWebGL中执行此操作:

re.textCanvas = textCanvas;

然后你可以通过使用 RenderEngineWebGL.textCanvas 在函数之外获取它。

更好的方法是创建一个公共"方法"来获取私有变量:

re.getTextCanvas = function() {
    return textCanvas;
};