[英]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
函数一样通过命名空间来引用全局变量。
*或者只是重命名全局变量,如果允许的话
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())
因为init()
函数赋值中的a
和b
指的是它的参数,而不是外部的a
和b
。 所以这些赋值不会影响外部a
和b
。
来自@reyno 的修改后的答案。 他的示例只是在.init
调用后将a
& b
猴子补丁到module
对象。 因此,这个变量是公共的,不再是私有的。
这样你会得到相同的结果,但保持变量 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.