js 预编译流程->解析变量提高

js预编译

步骤

先分析整个页面,而后逐一执行。此时会产生GO对象,Global Object对象。

GO对象javascript

一、将全部变量做为GO的属性,值均为undifinedjava

二、将函数声明也做为GO的属性,值为函数体。当函数声明和变量名相同时,覆盖第一步面试

执行函数时,产生AO对象,Actived Object对象。函数

一、将多有变量,形参做为AO的属性,值均为undifinedcode

二、实参的值赋给形参对象

三、将函数声明做为AO的属性,值为函数体,一样若与变量相同则覆盖ip

总结

预编译的四部曲:
1.建立GO(global object)/AO(active object)对象
2.找形参和变量声明,将变量和形参名做为AO属性名,值为undefined
3.将实参值和形参统一
4.在函数体里面找函数声明,值赋予函数体
DEMO
function f(a){
      console.log(a);
      var a=123;
      console.log(a);
      function a(){}
      var b=function(){}
      function d(){}
  }
  f(1)
代码分析:

1.建立AO对象io

AO={}

2.找形参和变量声明,将变量和形参名做为AO属性名,值为undefinedconsole

AO={
    a:undefined,
    b:undefined
}

3.将实参值和形参统一编译

AO={
    a:1,
    b:undefined
}

4.在函数体里面找函数声明,值赋予函数体:因为在函数中有 function a() {} ,这一函数所以此时AO中 a = function a() {}

AO={
 a:function a(){},
 b:undefined,
 d:function d(){}
}

而后代码依次执行,第一个console时取AO中的a为function a(){},而后a=123,改变AO中的a

AO={
 a:123,
 b:undefined,
 d:function d(){}
}

接着打印a为123

附带京东面试题

var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
  var name = 'Jack';
  console.log('Goodbye ' + name);
} else {
  console.log('Hello ' + name);
}
})();

变形一

var name = 'Tom';
(function(name) {
if (typeof name == 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})(name);

变形二

var name = 'Tom';
(function() {
if (typeof name == 'undefined') {
        let name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();
相关文章
相关标签/搜索