簡體   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