美文网首页程序员
*函数预编译相关[JavaScript_005]

*函数预编译相关[JavaScript_005]

作者: 六亲不认的步伐 | 来源:发表于2019-03-12 21:54 被阅读0次

JavaScript一些特点


  1. 单线程执行
  2. 解释性语言,解释一行执行一行

预编译


作用:可以进行初始化相关操作
原则(现象):函数声明整体提升; 变量 声明提升;
解释1:函数声明整体提升

test();//此时调用结果仍旧可以输出hello
function test(){
    console.log('hello');
}

原因:函数声明时会提升自己的位置,置于Js脚本顶部
解释2:变量 声明提升

var a ;
console.log(a);//此时结果为undefined
a = 'hello';
console.log(a);//此时结果为undefined
var a = 'hello';

原因:变量声明时会提升自己的位置,第二个脚本的声明和赋值操作在一起,所以可以看作脚本一的效果一致,将脚本二的声明放置顶部。

预编译前奏


imply gobal(暗示全局变量)

在变量未经过声明,直接进行赋值

  a = 10;
  console.log(a);//此时输出仍为10,但是此时的a为window.a,其中window为全局的域
 function test(){
var a = b =159;//其中b未声明,为window域所有
}
//输出window.a =undefined;
//输出window.b =159;

预编译详解(函数AO)


  • 步骤
    1. 创建AO (Activation Object)活跃对象,也是执行期上下文
    2. 找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
    3. 将实参与形参统一
    4. 函数体的函数声明,注意不是函数表达式
function fn(a){
console.log(a);//输出结果为function a(){}
var a =123;
console.log(a);//输出结果为123
function a(){};
console.log(a);//输出结果为123
var b = function(){}
console.log(b);//输出结果为function(){}
function d(){};
}
fn(1);

关注AO对象预编译的过程


阶段1

创建AO对象

阶段2

变量 原因
a undefined 初始化
b undefined 初始化
阶段3

变量 原因
a 1 实参与形参统一
b undefined 不变
阶段4

变量 原因
a function a(){} 函数声明
b undefined 不变
d function d(){} 函数声明

预编译详解(全局GO)


  • 步骤
    1. 创建GO (Global Object)全局对象,可以理解为window === GO
    2. 函数体的函数声明,注意不是函数表达式

预编译详解(混合GO+AO)


  • 预编译顺序:先生成GO对象,在执行方法前生成AO对象;
  • 访问关系:先访问AO,若不存在则访问GO;(链式关系
  • 练习1
gobal = 100;
function fn(){
console.log(gobal);//undefined
gobal = 200;
console.log(gobal);//200
var gobal = 300;
}
fn();
var global;
  • 练习2
function tests(){
console.log(b);//undefined(并不会报错,预编译时不考虑if)
if(a){
var b = 100;
}
console.log(b);
c = 234;
console.log(c);//234(为GO.c)
}
var a;
test();
a = 10;
console.log(c);//234
  • 练习3
a = 100;
function demo(e){
function e(){};//undefined
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(function c(){})
console.log(a);//10
}
var a;
demo(1);
console.log(a);//100
console.log(f);//123

相关文章

  • *函数预编译相关[JavaScript_005]

    JavaScript一些特点 单线程执行 解释性语言,解释一行执行一行 预编译 作用:可以进行初始化相关操作原则(...

  • 你需要知道的javascript的提升

    javascript在执行前会有一个预编译过程,预编译过程会先预声明变量再预定义函数,比如 预编译过后,类似于 运...

  • Day3

    学习内容:数组、函数收获: 熟悉了数组的相关知识; 熟悉了函数的相关知识,并掌握了用gcc编译多个.c文件; 通过...

  • linux 多线程&线程同步

    1. 头文件与编译选项 头文件:#include 编译选项:-lpthread 2. 线程相关函数 创建线程int...

  • 函数

    预解析: 变量和函数的预解析 预解析把变量的声明提前(但不赋值) 函数名加括号调用函数 预解析把函数声明和调用都提...

  • 二十三物件函数

    物件函数 该组函数用于处理与任何指定图表相关的图形物件。在处理当前图表上的物件时,直接使用访问。即在函数调用期间预...

  • 32位逆向分析

    启动函数 源码里必须实现一个WinMain函数,先执行由编译器生成的相关代码,再调用WinMain函数。分析过程中...

  • C++ 判断文件或者目录是否存在

    1. 说明 如果编译器支持C++17,则建议使用std::filesystem相关函数 也可使用stat函数来判断...

  • C++ 函数2

    这章再深入的讲些函数相关的。 1.C++内联函数 编译器对内联的函数处理就是将相应的函数的代码直接替换掉对应函数的...

  • 预解析预闭包的例子

    预解析、预闭包、自调函数、多赋值

网友评论

    本文标题:*函数预编译相关[JavaScript_005]

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