首页 > 其他分享 >执行上下文

执行上下文

时间:2023-04-20 18:47:50浏览次数:28  
标签:上下文 console log -- var 执行

变量提升与函数提升

变量声明提升

  • 通过var定义(声明)的变量--在定义语句之前就可以访问到
  • 值为undefined
console.log(a);	//undefined
var a = 1;
//执行顺序
var a;
console.log(a);
a = 1;

函数声明提升

  • 通过function声明的函数--在之前就可以直接调用
  • 值为函数定义(对象)
fn();//可调用
function fn(){
    conse.log('哈哈');
}

执行上下文

代码分类--位置

全局代码

函数(局部)代码

全局执行上下文

  • 在执行全局代码前将window确定为全局执行上下文

    • 对全局数据进行预处理
    • var定义的全局变量-->undefined--添加为window的属性
    • function声明的全局函数-->赋值--添加为window的方法
    • this-->赋值window
    • 开始执行全局代码
    //全局执行上下文
    console.log(a1, window.a1);  //undefined undefined
    a2();   //a2();
    console.log(this);  //window
    var a1 = 3;
    function a2() {
        console.log('a2()');
    }
    console.log(a1);
    

函数执行上下文

  • 在调用函数--准备执行函数体之前--创建对应的函数执行上下文对象--虚拟的,存在于栈中

    • 对局部数据进行预处理
    • 形参变量-->赋值(实参)--添加为执行上下文的属性
    • arguments-->赋值(实参列表)--添加为执行上下文的属性
    • var定义的局部变量-->underfined--添加为执行上下文的属性
    • this-->赋值(调用函数的对象)
    • 开始执行函数体代码
    //函数执行上下文
    function fn(a1) {
        console.log(a1);    //2
        console.log(a2);    //undefined
        a3();   //a3
        console.log(this);  //window
        console.log(arguments); //2,3
        var a2 = 4;
        function a3() {
            console.log('a3');
        }
    }
    fn(2, 3);
    

执行上下文栈

  • 在全局代码执行前--JS引擎会创建一个栈来存储管理所有的执行上下文对象
  • 在全局执行上下文(window)确定后--将其添加到栈中(压栈)
  • 在函数执行上下文创建后--将其添加到栈中(压栈)
  • 在当前函数执行完后--将栈顶的对象移除(出栈)
  • 当所有代码执行完成后--栈中只剩下window
<script>
    //执行全局上下文
	var a = 10;
	var bar = function (x) {
   		var b = 5;
    	foo(x + b); //进入foo执行上下文
	}
	var foo = function (y) {
    	var c = 5;
    	console.log(a + c + y);
	}
	bar(10);    //进入bar函数执行上下文
</script>

面试题

console.log('gb:' + i);
var i = 1;
foo(1);
function foo(i) {
    if (i == 4) {
        return;
    };
    console.log('fb:' + i);
    foo(i + 1);
    console.log('fe:' + i);
}
console.log('ge:' + i);

function a(){};
var a;
console.log(a); //f a(){}--变量先被提升--函数覆盖变量后提升
if(!(b in window)){
    var b = 1;
}
console.log(b); //undefined--变量先被提升为全局变量
var c = 1;
function c(c){
    var c = 3;
}
c(2);   //报错--变量先被提升--函数后被提升--变量最后被赋值--因此不是函数,不能被调用

标签:上下文,console,log,--,var,执行
From: https://www.cnblogs.com/Liu-h/p/17337906.html

相关文章

  • Flask 上下文是什么 ?
    哈喽大家好,我是咸鱼。今天我们来聊聊什么是Flask上下文 咸鱼在刚接触到这个概念的时候脑子里蹦出的第一个词是CPU上下文 今天咸鱼希望通过这篇文章,让大家能够对Flask上下文设计的初衷以及应用有一个基本的了解 Flask上下文我们在使用Flask开发web程序的时候,......
  • 3 02 | 日志系统:一条SQL更新语句是如何执行的?
    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听DBA同事说,MySQL可以恢复到半......
  • 2 01 | 基础架构:一条SQL查询语句是如何执行的?
    你好,我是林晓斌。这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有......
  • JS中定时执行,setTimeout和setInterval的区别,以及l解除方法
    评:setTimeout(Expression,DelayTime),在DelayTime过后,将执行一次Expression,setTimeout运用在延迟一段时间,再进行某项操作。setTimeout("function",time)设置一个超时对象setInterval(expression,delayTime),每个DelayTime,都将执行Expression.常常可用于刷新表达式.set......
  • finally语句的执行时刻
    评:语义上finally在return之后执行以前虽然知道在tryfinally语句中,即使try块里有return语句,finally语句也会在return语句执行之前执行,却不知道return表达式与finally语句的执行顺序。publicclassTest{publicstaticinta(){inti=0;try{i++;ret......
  • Java 8 中使用反射进行命令执行的 5 个方法
    今天在逛先知的时候看到了一篇文章:《探究使用反射进行除Runtime的命令执行方法》https://xz.aliyun.com/t/12446其中大概讲了下命令执行的其他构造方式,但最后没有给出实例,所以我这里就简单研究了一下。概述在RASP等安全产品防护严密的现在,普通的寻找Runtime.getRuntime().exec(......
  • 浏览器执行js脚本
    1、四种基本的形式(1)script内部<script>alert('xss')</script>(2)script引入外部js文件<scriptsrc='check.js'></script><scriptsrc=https://www.freebuf.com/freebuf/2.1.0.cd254c064b386bee9d41.js></script>需要注意如果当前页面是......
  • 一招解决由于找不到msvcp120.dll,无法继续执行代码的方法
    msvcp120.dll是vs2010编译的程序默认的库文件。msvcp120.dll可以解决电脑软件或某些大型游戏、程序由于vs2010编译系统中缺失此dll的问题。vs2010编写的程序运行所需dll。下载msvcp120.dll文件打开电脑随便一个浏览器顶部网页输入 【 dll修复程序.site 】进入后点击开始下载dl......
  • 大佬们,这个导包怎么写呀?本地执行可以,Linux执行报错
    大家好,我是皮皮。一、前言前几天在Python最强白银交流群【喜靓仔】问了一个Python路径处理的问题,这里拿出来给大家分享下。下图是他的代码:二、实现过程这里【小王子】给了一个答案,如下所示:代码如下:fromsysimportpathpath.insert(1,'../app/')importtesttest.test()顺利地......
  • python+playwright 学习-49 pytest-xdist 多进程执行用例
    前言在实际工作中项目下的web自动化用例非常多,单进程执行会消耗很长的运行时间,可能运行一次用例得几个小时。为了加快用例的运行速度,可以使用pytest-xdist多进程执行用例。但并不是说你写的用例,直接安装插件就能使用,实际使用的过程中还会遇到很多的问题。pytest-xdist多进程执行......