变量的定义

var

let

const

var let const比较

变量的类型

问题:如何判断变量的类型?

变量的类型转换

基础类型通过valueOf进行隐式转换

例如:如何让(a==1&&a==2)条件成立?

  1. let a = {
  2. value : 0,
  3. valueOf: function (){
  4. this.value++;
  5. return this.value;
  6. }
  7. }
  8. console.log(a==1&&a==2)

变量的声明与函数声明

  1. a = 1;
  2. var a;
  3. console.log(a);
  4. console.log(b);
  5. var b = 2;
  1. foo();
  2. function foo () {
  3. console.log(a);
  4. var a = 2;
  5. }
  6. foo2();
  7. var foo2 = function bar () {
  8. console.log(a);
  9. var a = 2;
  10. }
  11. foo3(); // TypeError
  12. bar(); // ReferenceError
  13. var foo3 = function bar () {}
  1. var a = function (){
  2. console.log(a);
  3. }
  4. var a = 100
  5. a()
  1. var a = function (){
  2. console.log(a);
  3. }
  4. a()
  1. let b = 10;
  2. (function b (){
  3. b = 20;
  4. console.log("inner-b",b)
  5. })()
  6. console.log("outter-b",b)
  7. let b = 10;
  8. (function b (){
  9. var b = 20;
  10. console.log("inner-b",b)
  11. })()
  12. console.log("outter-b",b)

匿名函数具名化

1.所有声明(变量和函数)都会被移动到各自作用域的最顶端,这个过程被称为提升。
2.函数表达式等各种赋值操作并不会被提升。
3.函数优先原则。
4.尽量避免产生提升问题。

JS在编译阶段会找到所有的声明,然后用合适的作用域将他们关联起来。变量声明会在编译阶段执行。

https://www.cnblogs.com/karthuslorin/p/8972585.html