为什么当我执行以下操作时:
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

答案 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
调用实际上是指相同的变量。