The definitions within a block are visible from within the block only. The definitions within a block shadow definitions with the same names that belong to the block’s outer scope. The block has a value just as any other expression. Its value is the value of the last expression it includes.
object Program { def main(args: Array[String]):Unit = { val a = 4 def func(num:Int) = num*num val number = { val b = func(4) val a = 6 a+b } + 2 println(number) } }
The following video clip goes over the code sample and explains it.