js 预编译环节的变量提升

Posted guozongzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 预编译环节的变量提升相关的知识,希望对你有一定的参考价值。

有些东西需要先告诉你怎么用,再去理解定义

关于变量的提升
function test () 
  console.log(a)
  var a = 100
  console.log(a)
;
test () // undefined  // 100
执行步骤
function test () 
  var a = undefined
  console.log(a)
  a = 100
  console.log(a)


关于函数的提升
function test () 
  console.log(a)
  function a () 
  console.log(a)
  function b () 
  console.log(b)
;
test() // function a ()  // function a ()  // function b () 
执行步骤
function test () 
  var a = undefined
  var b = undefined
  a = function a () 
  b = function b () 
  console.log(a)
  console.log(a)
  console.log(b)


关于变量和函数的混合提升
function test () 
  console.log(a)
  var a = 100
  console.log(a)
  function a () 
  console.log(a)
  function b () 
  console.log(b)
;
test() // function a ()   // 100  // 100 // function b () 
执行步骤
function test () 
  var a = undefined
  var b = undefined
  a = function a () 
  b = function b () 
  console.log(a)
  a = 100
  console.log(a)
  console.log(a)
  console.log(b)


关于形参和变量混合提升
function test (a)  // 定义函数中用来接收参数 这个就是形参
  console.log(a)
  var a = 100
  console.log(a)
;
// 调用函数的时候传具体的参数 这个参数就是实参
test(1) // 1 // 100
执行步骤
function test (a) 
  var a = undefined
  a = a // 右边的a是形参
  console.log(a)
  a = 100
  console.log(a)


关于形参和函数的混合提升
function test (a) 
  console.log(a)
  function b () 
  function a () 
  console.log(a)
  console.log(b)
;
test(1) // functioin a ()  // function a ()  // function b () 
执行步骤
function test (a) 
  var a = undefined
  var b = undefined
  a = a // 右边的a是形参
  b = function b () 
  a = function a () 
  console.log(a)
  console.log(a)
  console.log(b)


关于形参和变量和函数的混合提升
function test (a) 
  console.log(a);
  var a = 100;
  console.log(a)
  function a () 
  console.log(a)
  function b () 
  console.log(b)
;
test(1) // function a ()  // 100 // 100 // function b () 
执行步骤
function test (a) 
  var a = undefined
  var b = undefined
  a = a // 右边的a是形参
  a = function a () 
  b = function b () 
  console.log(a)
  a = 100
  console.log(a)
  console.log(a)
  console.log(b)


if 判断语句不影响变量提升 (if是执行语句,而变量提升属于预编译环节;js先编译后执行)
function test () 
  console.log(a)
  if (false) 
    var a = 100
    console.log(a)
  
;
test() // undefined 
执行步骤
function test () 
  var a = undefined
  console.log(a)
  if (false) 
    a = 100
    console.log(a)
  



总结:
函数内部js的预编译环节执行顺序如下
1. 将形参,变量提升到该函数的顶部(执行期上下文顶部)
2. 将形参,函数赋值到对应的变量 (先形参,后函数)
  

 

以上是关于js 预编译环节的变量提升的主要内容,如果未能解决你的问题,请参考以下文章

JS执行顺序预编译

js预编译

js 执行顺序

js复习,预编译

Javascript 的变量提升与预解析

js预解析