Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

185
Views
Javascript Scope in variables and functions

I was given this snippet to debug in one of my interviews.

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())

The value being returned is 0 (0+0), the assignment of a and b in func init didn't overwrite the global var a and var b. Why is this so, can someone please explain?

NOTE: I was told to fix it without renaming the function parameters (a,b).

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Instead of renaming the parameters you can also refer to the global variables via their namespace like you do with the init function.

*Or just rename the global variables, if that is allowed

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())

about 4 years ago · Juan Pablo Isaza Report

0

Because a and b in the assignments of init() function refers to its parameters, not the outer a and b. So those assignments don't affect values of the outer a and b.

about 4 years ago · Juan Pablo Isaza Report

0

Modified answer from @reyno. His example just monkey patch a & b to the module object after the .init call. Therefore this variables are public and not private anymore.

With this you get the same result, but maintain the variables a & b private.

To achieve this, use a private namespace object, like i did with 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

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!