前端面试基础必备JS学习笔记

JS变量声明提升和函数声明提升

2018-08-25  本文已影响10人  puxiaotaoc

一、JS是编译性语言
       JavaScript是脚本语言、编译性语言、解释性执行;和JAVA、C这种编译性语言的区别在于JS并不会像其他的编译语言一样进行提前编译,编译过程通常是在实际执行前进行的,而且也不会产生可移植的编译结果;

二、引擎、编译器、作用域

三、变量声明提升

  // 变量声明可以看成两部分:声明操作(var a)+赋值操作(a=10)
  // 声明操作会在编译阶段进行,声明操作会被提升到执行环境的顶部,值是undefined(未初始化)
  // 赋值操作会留在原地等待执行操作
  var a = 2;

  function foo() {
    console.log(a); // undefined
    var a = 10;
    console.log(a); // 10
  }
  foo();
// 上面的代码相当于
var a = 2;

  function foo() {
    var a; 
    console.log(a); // undefined
    a = 10;
    console.log(a); // 10
  }
  foo()

四、函数声明提升

// 函数声明
  foo(); // 100
  function foo(){
    console.log(100)
  }
// 函数表达式
  foo(); // TypeError: foo is not a function
  var foo = function(){
    console.log(100); 
  }
// 函数表达式的等价
var foo;
foo(); // TypeError: foo is not a function
foo = function(){
    console.log(100);
}

五、控制语句

if (false) {
    var a = 10;
  }
  console.log(a); // undefined
// 相当于
var a;
  if (false) {
    a = 10;
  }
  console.log(a); // undefined
console.log(a); // undefined
  if(false){
    function a(){
      console.log(100);
    }
  }
  a(); // TypeError: a is not a function 理论上应该是100

六、函数声明规则

  // 1
  foo(); //200

  function foo() {
    console.log(100);
  }

  function foo() {
    console.log(200);
  }
  
  // 2
  console.log(foo); //function foo(){...}

  function foo() {
    console.log(200);
  }
  var foo = 100;

七、猿辅导的面试题

var x = 1,
    y = z = 0;

  function add(n) {
    n = n + 1;
  }
  y = add(x);

  function add(n) {
  n = n + 3;
  }
  z = add(x);
  console.log(x, y, z); // 1 undefined undefined
var x = 1,
    y = z = 0;

  function add(n) {
    n = n + 1;
    return n;
  }
  y = add(x);

  function add(n) {
    n = n + 3;
    return n;
  }
  z = add(x);
  console.log(x, y, z); // 1 4 4

参考链接:https://www.cnblogs.com/Gary-Guoweihan/p/6251870.html

上一篇下一篇

猜你喜欢

热点阅读