<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?
答案 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
。
该函数还有其他未声明的变量,如a
和b
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
,还有a
,b
,li
和{{ 1}})