【问题标题】:Uncaught ReferenceError: g is not defined未捕获的 ReferenceError:未定义 g
【发布时间】:2014-08-20 02:32:58
【问题描述】:

好吧,我刚做了一个计算器,在 Chrome 上测试它时,我遇到了这个错误 “未捕获的 ReferenceError:未定义 g (匿名函数)”。尽管我只是使用

定义它
function chart(principal, interest, monthly, payments) {
    var graph = document.getElementById("graph");
    graph.width = graph.width;

    if (arguments.length == 0 || !graph.getContext) return;

    var g = graph.getContext("2d"); 
    //g is defined here yet on line 147, i get the          
    //error
    var width = graph.width,
        height = graph.height;

    function paymentToX(n) {
        return n * width / payments;
    }

    function amountToY(a) {
        return height - (a * height / (monthly * payments * 1.05));
    }

    g.moveTo(paymentToX(0), amountToY(0));
    g.lineTo(paymentToX(payments),
    amountToY(monthly * payments));

    g.lineTo(paymentToX(payments), amountToY(0));
    g.closePath();
    g.fillStyle = "#f88";
    g.fill();
    g.font = "bold 12px sans-serif";
    g.fillText("Total Interest Payments", 20, 20);

    var equity = 0;
    g.beginPath();
    g.moveTo(paymentToX(0), amountToY(0));
    for (var p = 1; p <= payments; p++) {
        var thisMonthsInterst = (principal - equity) * interest;
        bal -= (monthly - thisMonthsInterst);
        g.lineTo(paymentToX(p), amountToY(bal));
    }
    g.lineWidth = 3;
    g.stroke();
    g.fillStyle = "black";
    g.fillText("Loan Balance", 20, 20);

    g.textAlign = "center";
    var y = amountToY(0);
    var x = paymentToX(year * 12);
    g.fillRect(x - 0.5, y - 3, 1, 3);
    if (year == 1) g.fillText("Year", x, y - 5);
    if (year % 5 == 0 && year * 12 !== payments) g.fillText(String(year), x, y - 5);
 }
g.lineWidth = 3;
g.stroke();
g.fillStyle = "black";
g.fillText("Loan Balance", 20, 20);

g.textAlign = "center";
var y = amountToY(0);
var x = paymentToX(year * 12);
g.fillRect(x - 0.5, y - 3, 1, 3);
if (year == 1) g.fillText("Year", x, y - 5);
if (year % 5 == 0 && year * 12 !== payments) g.fillText(String(year), x, y - 5);
 g.textAlign = "right";
  g.textBaseline = "middle";
}

即使修改后,我仍然有同样的错误。

【问题讨论】:

  • @ArtOfCode 我猜在这个函数之外
  • 格式化代码后有没有注意到语法问题?
  • 最后一行是147,@ArtOfCode
  • 在函数内移动最后两行
  • 函数paymentToXamountToY应该在chart之外。然后在函数之外定义var g

标签: javascript html


【解决方案1】:

函数chartg.lineWidth = 3 之前结束。超出此点的所有内容都没有g 的定义。

【讨论】:

    【解决方案2】:

    g.textAlign 和 g.textBaseline 在您定义 g 的函数之外

    【讨论】:

    • 是否有可以在整个脚本中使用的全局变量?
    • @user3788077 你应该避免使用全局变量。几乎没有充分的理由使用它们。你的用例是什么?也许我们可以在不使用全局变量的情况下找出解决问题的方法。 IE。为什么你不能把这两行塞进函数里?
    • @user3788077 将所有内容包装在 iife 中,然后在 iife 的最顶部声明​​ g .. 其他所有内容都在此函数声明之下。这不会污染全局空间,即使在图表函数之外也允许访问g 变量。
    • 它在函数内部,你看到的括号是for循环。后面还有一个括号。
    • @user3788077 循环块之前已关闭(for (var p = 1; p &lt;= payments; p++) {...之后的 4 行...
    猜你喜欢
    • 2023-01-23
    • 2016-11-03
    • 2011-01-05
    • 2016-01-02
    • 2013-10-06
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多