繁体   English   中英

变量和函数中的 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 avar 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()函数赋值中的ab指的是它的参数,而不是外部的ab 所以这些赋值不会影响外部ab

来自@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM