[英]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.