美文网首页
JS递归,预编译

JS递归,预编译

作者: iliuqiang | 来源:发表于2020-03-14 08:12 被阅读0次

变量提升经典题目:
第一题:

global=100;
function test(){
    console.log(global); // undefined
    global=200;
    console.log(global); // 200
    var global=300;
}
test();
var global;

利用预编译的Global Object和Activation Object思想来分析:

GO={
    global:100;
    test:xxx
}

AO={
    global:undefined
}

test中第一步打印时,发现AO中有自己的global属性,就不去找GO中的global属性了,因此打印出undefined,而不是100。

AO={
    global:200
}

因此第二步打印时,打印出200
第二题:

function test(){
    console.log(b); //undefined
    if(a){
        var b=100;
    }
    console.log(b); //undefined
    c=234;
    console.log(c); //234
}
var a;
test();
a=10;
console.log(c); //234

利用预编译的Global Object和Activation Object思想来分析:

GO={
    a:undefined;
    test:xxx
}

AO={
    b:undefined
}

注意:预编译是发生在函数执行之前,因此这里不管if条件成立不成立,都会存在变量b的声明。
因此第一步打印b时,值为undefined。
继续往下走,由于此时AO中没有a变量,因此去GO中找,发现值为undefined,所以if条件不成立,b也就未能赋值成功,因此下一步打印b时,值仍为undefined。

第3题:

a=100;
function demo(e){
    function e(){};
    arguments[0]=2;
    console.log(e);  //2
    if(a){
        var b=123;
        function c(){}
    }
    var c;
    a=10;
    var a;
    console.log(b); //undefined
    f=123;
    console.log(c); //undefined
    console.log(a); //10
}
var a;
demo(1);
console.log(a); //100
console.log(f); //123

利用预编译的Global Object和Activation Object思想来分析:

GO={
    a:100;
    demo:xxx
}

AO={
    e:undefined,
    b:undefined,
    c:undefined,
    a:undefined
}

接下来参数的第一个被赋值为了2,因此:

AO={
    e:2,
}

因此此时打印e的值为2。
下面进入if条件,由于在AO中a的值为undefined,所以条件不成立,又由于新规定if条件语句中,不能定义函数,所以c的值为undefined。因此此时:

AO={
    e:2,
    b:undefined,
    c:undefined,
    a:undefined
}

接下来a被赋值为10,所以:

AO={
    e:2,
    b:undefined,
    c:undefined,
    a:10
}

所以此时b,c,a的打印值分别为:undefined,undefined,10
接下来在全局作用域中打印a,由于在GO对象中存在a,

GO={
    a:100,
}

因此此时打印a的值为100。
由于f在AO中未声明,因此放入GO中:

GO={
    a:100;
    demo:xxx,
    f:123
}

所以此时打印f的值为:123

隐式类型转换题目:
第1题:

if(typeof(a)&&-true+(+undefined)+''){
    console.log('a');
}else{
    console.log('b');
}

答案:a
分析:

typeof(a)   => 'undefined';
-true       => -1
+undefined  => NaN
-1+NaN      => NaN
NaN+''      => 'NaN'

因此,'undefined'&&'NaN'条件成立,所以打印出a。

第2题:

if(10+'10'*2==30){
    console.log('a');
}else{
    console.log('b');
}

答案:a
分析:

'10'*2     => 20
10+20==30  => true

因此答案为a。

第3题:

if(!!" "+!!""-!!false){
    console.log('a');
}else{
    console.log('b');
}

答案:a
分析:

!!" "             => true
!!""              => false
!!false           => false
true+false-false  =>1

所以条件成立,打印出a

相关文章

  • JS递归,预编译

    变量提升经典题目:第一题: 利用预编译的Global Object和Activation Object思想来分析:...

  • JS的变量和函数提升

    1.js的运行和预编译过程 <1>.语法分析 查找基本语法有无错误; <2>、预解析/预编译 执行之前进行预解析;...

  • day05-JS运行和编译

    1.JS运行和编译 1.1语法分析:查找基本语法有没有错误 1.2 预解析:执行之前进行预解析 ...

  • webpack核心原理二:源码

    思路 递归的解析出模块之间的关系 babel编译转换各模块的语法 生成浏览器端可执行的js文件 bundle.js...

  • 树形结构递归/原生js实现/vue递归组件

    原生js实现递归渲染 Vue2.0递归组件

  • 2018-07-06

    js高级 今日所学摘要: ①js的预编译:js很特别,在js代码执行前会进行预编译,预编译的结果就是——变量提升。...

  • JS预解析

    JS解释器运行JS分为两步:预解析、代码执行 预解析 JS解释器会把JS里面所有的var和function提升到当...

  • 组件递归 & js递归

    一、el-tree实现原理—组件递归 举一个栗子: 1、组件引入,并调用。组件name为“func-table” ...

  • js递归

    递归 何为递归 递归,就是在运行的过程中调用自己,一般情况下多为函数自己调用自己。 构成递归需具备的条件 子问题须...

  • js递归

    递归 递归的概念在程序中函数直接或间接调用自己直接调用自己简介调用自己跳出结构,有了跳出才有结果思想递归的调用,最...

网友评论

      本文标题:JS递归,预编译

      本文链接:https://www.haomeiwen.com/subject/dpapshtx.html