在javascript中意外的值更改

时间:2015-06-29 03:59:13

标签: javascript

<body>
<script src="http://www.cse.msu.edu/~zhangh40/w/wgl.js"></script>
<script>

    var li = [[1,3,4,5],[1,2,3,1],[3,5,6,2]];
    var m = r4dxy(0.1);
    var i = 0;
    li[i] = m.ope(li[0]);
    document.write(i);

</script>

为什么变量&#39; i&#39;在上面的代码将更改为5?

2 个答案:

答案 0 :(得分:3)

http://www.cse.msu.edu/~zhangh40/w/wgl.js文件中的错误是在i方法

中的以下循环中创建全局变量matrixMul
for (i = 1; i <= this.r * other.c; i++) {

应该是

for (var i = 1; i <= this.r * other.c; i++) {

在非严格模式下,当您在作用域中分配未使用var声明的变量时,将在全局作用域中创建变量。

在您的情况下,您的变量i位于使用值0初始化的全局空间中,但是当您调用m.ope时,它会在内部调用matrixMul来覆盖该值在影响变量的全局范围内i

该函数还有其他未声明的变量,如ab

function matrixMul(other) {
    var i, a, b;
    if (this.c != other.r)
        return false;
    li = [];
    for (i = 1; i <= this.r * other.c; i++) {
        a = (i % other.c == 0) ? other.c : (i % other.c);
        b = Math.floor((i - 1) / other.c + 1);
        sum = 0;
        for (j = 1; j <= other.r; j++)
            sum += (this.at(b, j) * other.at(j, a));
        li.push(sum);
    }
    return new matrix(li, this.r, other.c);
}

答案 1 :(得分:1)

因为http://www.cse.msu.edu/~zhangh40/w/wgl.js中的代码写得不正确。

该代码的功能如下:

function matrixMul(other){
    if(this.c != other.r)
        return false;
    li = [];
    for(i=1;i<=this.r*other.c;i++){
        a = (i%other.c==0)?other.c:(i%other.c);
        b = Math.floor((i-1)/other.c+1);
        sum = 0;
        for(j=1;j<=other.r;j++)
            sum+=(this.at(b,j)*other.at(j,a));
        li.push(sum);
    }
    return new matrix(li,this.r,other.c);
}

注意该函数如何使用变量i 而不使用var语句。这意味着它与全局变量i混淆,并影响周围的代码。该方法需要使用var来引用其所有内部变量(不只是i,还有abli和{{ 1}})