Javascript 变量和函数的作用域
Javascript Scope in variables and functions
在我的一次采访中,我得到了这个片段来调试。
var module = (function sumModule(){
var a = 0;
var b = 0;
const init = (a,b) =>{
a = a;
b = b;
}
function sum() {
return a+b;
}
return {
sum: sum,
init
}
})();
module.init(1,2);
console.log(module.sum())
返回的值为 0 (0+0),func init
中 a 和 b 的赋值没有覆盖全局 var a
和 var b
。为什么会这样,有人能解释一下吗?
注意:有人告诉我在不重命名函数参数的情况下修复它 (a,b)
。
因为init()
函数赋值中的a
和b
指的是它的参数,而不是外层的a
和b
。
所以这些分配不会影响外部 a
和 b
.
的值
除了重命名参数,您还可以通过 命名空间 引用全局变量,就像您使用 init
函数一样。
*或者只要重命名全局变量,如果允许的话
var module = (function sumModule(){
var a = 0;
var b = 0;
const init = (a, b) => {
module.a = a;
module.b = b;
}
function sum() {
return module.a + module.b;
}
return {
sum: sum,
init,
}
})();
module.init(1, 2);
console.log(module.sum())
来自@reyno 的修改后的答案。
他的示例只是在 .init
调用之后将 a
& b
猴子修补到 module
对象。因此这个变量是 public 并且不再是私有的。
这样你会得到相同的结果,但将变量 a 和 b 保持私有。
为此,请使用私有命名空间对象,就像我对 private
所做的那样。
var module = (function sumModule(){
var private = {
a: 0,
b: 0
}
const init = (a, b) => {
private.a = a;
private.b = b;
}
function sum() {
return private.a + private.b;
}
return {
sum: sum,
init,
}
})();
console.log(module) // no a or b property
module.init(1, 2);
console.log(module.sum())
console.log(module) // still no a or b property
在我的一次采访中,我得到了这个片段来调试。
var module = (function sumModule(){
var a = 0;
var b = 0;
const init = (a,b) =>{
a = a;
b = b;
}
function sum() {
return a+b;
}
return {
sum: sum,
init
}
})();
module.init(1,2);
console.log(module.sum())
返回的值为 0 (0+0),func init
中 a 和 b 的赋值没有覆盖全局 var a
和 var b
。为什么会这样,有人能解释一下吗?
注意:有人告诉我在不重命名函数参数的情况下修复它 (a,b)
。
因为init()
函数赋值中的a
和b
指的是它的参数,而不是外层的a
和b
。
所以这些分配不会影响外部 a
和 b
.
除了重命名参数,您还可以通过 命名空间 引用全局变量,就像您使用 init
函数一样。
*或者只要重命名全局变量,如果允许的话
var module = (function sumModule(){
var a = 0;
var b = 0;
const init = (a, b) => {
module.a = a;
module.b = b;
}
function sum() {
return module.a + module.b;
}
return {
sum: sum,
init,
}
})();
module.init(1, 2);
console.log(module.sum())
来自@reyno 的修改后的答案。
他的示例只是在 .init
调用之后将 a
& b
猴子修补到 module
对象。因此这个变量是 public 并且不再是私有的。
这样你会得到相同的结果,但将变量 a 和 b 保持私有。
为此,请使用私有命名空间对象,就像我对 private
所做的那样。
var module = (function sumModule(){
var private = {
a: 0,
b: 0
}
const init = (a, b) => {
private.a = a;
private.b = b;
}
function sum() {
return private.a + private.b;
}
return {
sum: sum,
init,
}
})();
console.log(module) // no a or b property
module.init(1, 2);
console.log(module.sum())
console.log(module) // still no a or b property