为什么被调用函数中的参数必须具有其他"names",并且与调用它的参数不同?



函数方块中的参数或参数(我不知道哪个是正确的)是"y",但在 for 循环中它是"x"。为什么程序必须复制"x"并称之为"y"?它也适用于"x"(我试过),代码工作正常。那么为什么要有额外的麻烦呢?这对我来说更有意义,因为我是 JS 的新手,保持名称相同。有人可以解释一下吗?

document.writeln("<h1>Square the numbers from 1 to 10</h1>");
for (var x = 1; x <= 10; ++x)
document.writeln("<p>The square of " + x + " is " + square(x) +
"</p>");
function square(y) {
return y * y;
} //end
//This works too:
// function square(x) {
//
//    return x * x;
//  }

这是计算机科学中所谓的"范围"的结果。

在JavaScript中,作用域由其封闭的"执行上下文">ECMA定义,其设计类似于一堆卡片。

实际上,这意味着名称引用内存位置的某些区域。您的编码示例突出显示了一个方案,其中两个不同的内存位置使用相同的名称引用,因为它们位于不同的区域。

在 JavaScript 中,为不同的名称引用创建其中一个区域的一种方法是使用函数。在函数内部,新名称将优先于外部名称。

因此,当您遇到以下情况时:

for ( var x = 1; x <= 10; ++x ){
square(x);
}
function square(x){
return x * x;
}

这里令人困惑的部分主要是在两个地方都使用了相同的变量名称。

函数内部的 x 变量实际上位于其自己的名称引用区域中。在该区域内,x 现在指 x 的参数值,而不指任何其他值。

从更技术的角度来看,当前有一个执行上下文在 for 循环中执行代码。它包含一个内存环境,该环境具有x的条目。调用square(x)时,它将使用该值传递到函数平方的新执行上下文。在 square 的执行上下文中,还有一个内存环境。此内存环境包含函数参数的条目,也称为 x。请注意,内存位置是不同的,因为有两个不同的执行上下文和两个不同的内存环境。

所以真的,从技术角度来看,不需要有不同的名称。但是,从可读性的角度来看,它很难阅读,这使得程序以后更难构建。

至于为什么要这样做,那是因为内存管理和执行效率。有一种称为"垃圾收集"的机制,它会在可以的时候运行(当有空闲处理器时间时)删除未使用的内存。当此内存超出范围时,它被确定为未使用(这就是执行上下文很重要的原因)。此外,在查找变量值期间,先有一个小区域开始,然后向外扩展会使查找速度更快。这是在幕后使用范围界定的两个主要原因。

function square(y){ // whatever parameter name
return y * y;
}

上面是一个函数定义,它是一个可以从程序中的任何位置调用的单个事物。 由于它可能在多个位置使用,因此可以使用任何参数名称。

每当调用函数时,都应该更加关注传递给函数的值。

请确保在函数定义中使用相同的参数名称。

假设上面的程序有超过 1 个 for 循环,

for ( var x = 1; x <= 10; ++x )
document.writeln( "<p>The square of " + x + " is " + square(x)
+ "</p>" );
for ( var y = 1; y <= 5; ++y )
document.writeln( "<p>The square of " + y + " is " + square(y)
+ "</p>" );

function square(z){ 
return z * z;
}

最新更新