Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why are my functions executing in the wrong order?

Tags:

javascript

I want to know why my program outputs I4 output then I3 output

var a = 4;
var i = 0;
var i3 = function() {
  console.log("I3 output")
  return i = i + 3
}
var i4 = function() {
  console.log("I4 output")
  return i = 4
}

(a > 3) && i3() || (a < 5) && i4();
console.log(i)

I want I3 output then I4 output. Why doesn't this work?

like image 374
luz Avatar asked Oct 26 '21 06:10

luz


People also ask

Does the order of a function matter?

The order of functions starts to matter hugely when functions are declared and invoked inside other functions (these are also called closures).

Does JavaScript execute functions in order?

Asynchronous FunctionsThe functions will be initialized in order, but they will all execute roughly at the same time. You can't consistently predict which one will finish first: the one that happens to take the shortest amount of time to execute will finish first.

Is the function executed before it is called?

The statements inside the function do not get executed until the function is called, and the function definition generates no output.


Video Answer


2 Answers

It's because you are missing a semicolon.

This :

var i4 = function() {
  console.log("I4 output")
  return i = 4
}

(a > 3)

is executed like this :

var i4 = function() {
  console.log("I4 output")
  return i = 4
}(a > 3) // <--- You are executing i4, passing it "a > 3" as argument

Sidenote : Javascript allows you to do this, leading to a bug; but Typescript complains. It says that you are calling a function with 1 argument, when it expects 0. Typescript really is some improvement over JS and taught me a lot about it.

If you add a semicolon, the function is defined, but not executed :

var a = 4;
var i = 0;
var i3 = function() {
  console.log("I3 output")
  return i = i + 3
};

var i4 = function() {
  console.log("I4 output")
  return i = 4
}; // <-- Add semicolon

(a > 3) && i3() || (a < 5) && i4();
console.log(i)
like image 199
Jeremy Thille Avatar answered Oct 21 '22 14:10

Jeremy Thille


First I'd urge you start using semi-colons. ASI (Automatic Semi-colon Insertion) is an error correction process, and you'll find these kinds of errors creeping in if you don't.

Second, further to that, maybe consider function declarations rather than function expressions. Again, you're missing semi-colon at the end of i4 is the issue causing the problem which can be avoided with a declaration instead which don't need to terminate with them.

Third, if you're looking to call both functions you need to call them separately. If you use a logical OR the second expression won't be evaluated because the first will always evaluate as truthy.

var a = 4;
var i = 0;

function i3() {
  console.log('I3 output');
  return i = i + 3;
}

function i4() {
  console.log('I4 output');
  return i = 4;
}

(a > 3) && i3();
(a < 5) && i4();

console.log(i);
like image 42
Andy Avatar answered Oct 21 '22 13:10

Andy