类似于面向对象的原型链, local -> global -> window ,如果局部拿不到变量,则从全局拿取,如果全局拿不到变量,就从window里面拿变量。
'use strict';
// global variable
window.variable = 'window variable';
variable = 'global variable';
console.log(window.variable) // 'window variable'
"use strict";
window.variable = 'window variable'
variable = 'global variable'
// var variable = 'var variable'
let testFunc = e => {
console.log('window:',window.variable); // global variable
console.log('var:',variable); // undefined
var variable = 'local variable'
return variable
}
console.log(
testFunc()
);// local variable
variable = 'variable'
会报错。这里还要说明:为什么console.log('var:',variable); // undefined
,问题在于var 函数内部声明的时候会发生一个提升('hoisting'),请看下文,这就是为什么variable
是undefined
;let testFunc = e => {
var variable;
console.log('window:',window.variable); // global variable
console.log('var:',variable); // undefined
variable = 'local variable'
return variable
}
var foo = function (){
var a = 3;
var b = 5;
var bar = function (){
var b= 7;
var c = 11;
console.log(`a:${a},b:${b},c:${c}`); // a:3 b:7 c:11
a += b+c;
console.log(`a:${a},b:${b},c:${c}`); // a:21 b:7 c:11
};
console.log(`a:${a},b:${b},c:${c}`); // a:3 b:5 c:未定义会报错
bar();
console.log(`a:${a},b:${b},c:${c}`); // a:21 b:7 c:undefined
}
foo()
这是重要的一种技术,闭包内可以保存变量了,在下一次调用的时候可以记住变量。
"use strict";
let pingpong = (e => {
var PRIVATE = 0;
let let_private = 10;
return {
inc: e => {
PRIVATE += e;
return PRIVATE;
},
dec: e => {
PRIVATE -= e;
return PRIVATE;
}
}
})()
console.log(
pingpong.inc(3),
pingpong.inc(3),
pingpong.dec(10)
);
在《JavaScript 函数式编程》里面看到的一种变量命名方式,将{a:['first',second]}
将他的值以数组形式储存起来,这样就可以得到上一次的命名值;