-2
i = 3;
j = 2;

function domath(x) {
    i = 4;
    j = 1;
    return i*x + j;
}

j = domath(i) - j;
alert(j); //expected result = 11

k = domath(i) + j;
alert(k); //expected result = 15

上面的 JavaScript 代码没有返回预期的结果(如代码中的注释所示)。请为我更正代码吗?

4

5 回答 5

3

由于您不使用var,因此您在第一行中定义的变量实际上ij您在domath()函数中定义的变量相同...

尝试这个 :

i = 3;
j = 2;

function domath(x) {
    var i = 4;
    var j = 1;
    return i*x + j;
}

j = domath(i) - j;
alert(j); //expected result = 11

k = domath(i) + j;
alert(k); //expected result = 15

PS:更改变量名称以使您的代码更具可读性可能是个好主意

于 2013-04-24T09:53:14.953 回答
1

使用声明你的变量var

var i = 3;
var j = 2;

function domath(x) {
  var i = 4;
  var j = 1;
  return i * x + j;
}
于 2013-04-24T09:52:47.367 回答
0
var i = 3;
var j = 2;

function domath(x) {
    var i = 4;
    var j = 1;
    return i*x + j;
}

var x = domath(i) - j; // overwriting J will change your next expected result
alert(x); //expected result = 11

var k = domath(i) + j;
alert(k); //expected result = 15
于 2013-04-24T09:54:41.657 回答
0

问题是您正在覆盖全局变量,即搞砸了您的数学:

j = domath(i) - j;

这个表达式是从左到右计算的。调用domath()将为 and 分配新值ij因此此处的有效代码如下:

j = (i = 4) * 3 + 1 - 1;

所以一旦完成,j将设置为12,这确实不是11。此外,i将有一个值4

要在函数中使用局部变量,您必须重新声明它们,本质上隐藏此范围之外的全局变量:

function domath(x) {
    var i = 4;
    var j = 1;
    return i * x + j;
}

这一次,第一个 assignment 将被解析为 this,因为domath()不会接触ij分配到外部:

j = 4 * 3 + 1 - 2

完成此操作后,将按预期j设置为 。11


为避免此类问题,最好var在定义新变量时始终使用(无论如何在想要编写strict代码时都必须这样做),并且不要使用如此简短、不明确的变量名称。我会考虑将单字符变量名的使用限制在迭代器和其他范围非常有限的东西上。永远不要因为某些东西是全球性的。

于 2013-04-24T09:56:52.343 回答
0

这似乎是一种非常讨厌的做事方式。

我个人会做类似的事情:

var v1;
var v2;

function math(x){ //do math here then return}
alert(math(1))

如果你真的必须在每个地方使用相同的变量,至少这样做:

var i = 3;
var j = 2;

function domath(x) {
var i = 4;
var j = 1;
return i*x + j;
}

有意义的变量名称也将使您保持良好的状态,使用 var 而不是 global 也会对您有所帮助!

于 2013-04-24T09:52:30.720 回答