javaScript - 变量

avatarplhDigital nomad

关于js的变量(为了统一,加上'use strict');

词法作用域

类似于面向对象的原型链, 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'),请看下文,这就是为什么variableundefined;

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]}将他的值以数组形式储存起来,这样就可以得到上一次的命名值;