function bar() {
var foo = 'local value'
console.log(foo)
}
bar() // ?
console.log(foo) // ?function bar() {
var foo = 'local value'
console.log(foo)
}
bar() // 'local value'
console.log(foo) // foo is not definedfunction someFunc(){
var outerVar = 1;
console.log(innerVar)
console.log(outerVar)
function zip(){
var innerVar = 2;
console.log(innerVar)
console.log(outerVar)
}
zip()
}
someFunc()
// ?function someFunc(){
var outerVar = 1;
console.log(innerVar)
console.log(outerVar)
function zip(){
var innerVar = 2;
console.log(innerVar)
console.log(outerVar)
}
zip()
}
someFunc()
//Uncaught ReferenceError: innerVar is not defined
The inner function has access to the outer function. But not vice versa.
function someFunc(){
var outerVar = 1;
//console.log(innerVar)
console.log(outerVar)
function zip(){
var innerVar = 2;
console.log(innerVar)
console.log(outerVar)
}
zip()
}
someFunc()
// ?
function someFunc(){
var outerVar = 1;
//console.log(innerVar)
console.log(outerVar)
function zip(){
var innerVar = 2;
console.log(innerVar)
console.log(outerVar)
}
zip()
}
someFunc()
//1
//2
//1
Functions cannot access sibling function scopes.
function someFunc(){
function zip(){
var sibling1 = 'hey'
console.log(sibling2)
}
function quux(){
var sibling2 = 'hi'
console.log(sibling1)
}
zip()
quux()
}
someFunc()
// ?function someFunc(){
function zip(){
var sibling1 = 'hey'
console.log(sibling2)
}
function quux(){
var sibling2 = 'hi'
console.log(sibling1)
}
zip()
quux()
}
someFunc()
//sibling1 and sibling2 are undefinedIf a variable is in scope, it is closed over. That is a closure.
Closure uses the concept of scope to build up a list of what variables are available to it.
The new ES6 keyword 'let' allows for block scoping.
var things = ['a', 'b', 'c']
for(let i = 0; i < things.length; i++){
console.log(things[i])
}
console.log(i)
// ?var things = ['a', 'b', 'c']
for(let i = 0; i < things.length; i++){
console.log(things[i])
}
console.log(i)
//a
//b
//c
//Uncaught ReferenceError: i is not definedvar things = ['a', 'b', 'c']
for(var i = 0; i < things.length; i++){
console.log(things[i])
}
console.log(i)
// ?var things = ['a', 'b', 'c']
for(var i = 0; i < things.length; i++){
console.log(things[i])
}
console.log(i)
//a
//b
//c
//3Unlike C#, all variables declared with the keyword 'var' get hoisted to the top of the function.
The variable gets
function addToQueue(names, queueLength){
var positions = []
for (var i = 0; i < names.length; i++) {
positions[i] = function() {
return queueLength + i + 1
}
}
console.log(positions)
console.log(i)
return positions
}
var people = ['Ash', 'Kelly']
var queuePositions = addToQueue(people, 10)
console.log(queuePositions[0]()) // 13?! Should be 11
console.log(queuePositions[1]()) // 13 As well! Should be 12http://bit.ly/1XsCRFO
http://bit.ly/24UXp9k