将参数传递到左侧与右侧相反的区别是什么?

时间:2017-12-21 21:28:45

标签: javascript

为什么当我执行以下操作时:



var a = 1;

function foo(a) {
  a = 2;
}

foo();
console.log(a); // a = 1




但是我得到了不同的结果:



var a = 1;

function foo() {
  a = 2;
}

foo();
console.log(a); // a = 2




3 个答案:

答案 0 :(得分:1)

在第一个示例中,函数foo参数a正在遮蔽全局变量a,因此全局变量的值永远不会改变。第一个示例中的代码与此相同:

var a = 1;

function foo(x) {
  x = 2;
}

在第二个示例中,您将在函数a的主体内引用全局变量foo。这里没有变量阴影,因此您得到了预期的结果 - a被赋予了2的值。

答案 1 :(得分:0)

如果将a作为参数传递给该函数 - 那么该函数中a的值将被隔离,并且只能在该函数中访问。否则,在函数外定义的a将在所有函数和对象之间共享。

同意@RomanPerekhrest - 阅读。

**更新回复评论**

var a = 1; 
function foo(a) { 
  a = 2;
}
foo();
console.log(a); // a = 1

在上面的代码中,第2行和第3行对a的引用与第1行和第6行的a不同。在评论的代码中,您设置的是{{ 1}}到a函数中x的值。这与原始问题有点不同。否?

答案 2 :(得分:0)

JavaScript在左/右侧确实没有"参数。"您的第一个示例传递参数。您的第二个示例使用closure

  

在编程语言中,闭包(也是词法闭包或函数闭包)是用于在具有第一类函数的语言中实现词法范围的名称绑定的技术。在操作上,闭包是将函数与环境一起存储的记录:将函数的每个自由变量(本地使用但在封闭范围中定义的变量)与名称绑定到的值或引用相关联的映射。关闭创建了。闭包 - 与普通函数不同 - 允许函数通过闭包的值或引用的副本来访问那些捕获的变量,即使函数在其范围之外被调用。

在第一个示例中,函数a内的变量foo与函数外的a不同。更改foo的参数a对传递给a的全局变量console.log没有影响。

在第二个示例中,变量a不是参数,而是函数foo捕获的环境的一部分。该日志显示修改后的a值,因为foo内的分配和console.log外的foo调用实际上是指相同的变量。