原文地址:https://www.xingkongbj.com/blog/js/execution-context.html

JavaScript 中的执行上下文和调用栈

ES6 变量作用域与提升:变量的生命周期详解

变量提升

  • 变量的定义在代码预解析时,在作用域顶部定义
  • 无 var 没有变量提升
console.log(a);  // undefined,如果没有定义会直接报错
var a = 'aaa';
console.log(a); // aaa // 下面代码全等于上面代码
var a; // 变量提升,函数作用域范围内
console.log(a); // undefined
a = 'aaa';
console.log(a); // aaa console.log(a); // 直接报错
a = 'aaa';

函数提升

  • 函数的定义在代码预解析时,在作用域顶部定义
  • 函数赋值在作用域顶部
console.log(f1);  // f1() { console.info('函数'); }
var f1 = function() { console.info('变量'); }
console.log(f1); // ƒ () { console.info('变量'); }
function f1() { console.info('函数'); }
console.log(f1); // ƒ () { console.info('变量'); } // 下面代码全等于上面代码
var f1; // 定义提升
function f1() { console.info('函数'); } // 函数顶部赋值
console.log(f1); // f1() { console.info('函数'); }
f1 = function() { console.info('变量'); }
console.log(f1); // ƒ () { console.info('变量'); }
console.log(f1); // ƒ () { console.info('变量'); }

函数上下文关系

  • 函数的上下文关系在定义时确定
var scope = "global scope";
function checkscope() {
var scope = "local scope";
function f() { return scope; }
return f;
}
checkscope()(); // local scope

this 上下文关系

  • this 的上下文关系在执行时确定

正常函数调用,this 指向 window

// 在 function 里
function test() {
var type = this === window;
return type;
}
test(); // true

方法调用,this 指向调用对象

// 在对象里
var obj = {
test: function() {
var type = this === obj;
return type;
}
};
obj.test(); // true // 在 prototype 对象的方法中
function obj() {
}
obj.prototype.test = function() {
return this;
}
var o = new obj();
o.test() === o; // true

构造器函数调用,this 指向 new 生成的对象

// 调用 new 构造对象时
function obj() {
this.test = function() {
return this;
}
}
var o = new obj();
o.test() === o; // true

apply / call 调用

function test() {
return this;
}
var o = {}; // apply
test.apply(o) === o; // true // call
test.call(o) === o; // true

dom 的事件属性中

// 点击后输出 true
<input id="a" type="text" onclick="console.info(this === document.getElementById('a'))" /> // 点击后输出 true
<input id="a" type="text" />
<script type="text/javascript">
document.getElementById('a').addEventListener("click", function(){
console.info(this === document.getElementById('a'));
});
</script> // 点击后输出 true
<input id="a" type="text" />
<script type="text/javascript">
document.getElementById('a').onclick = function(){
console.info(this === document.getElementById('a'));
});
</script>

执行上下文--变量、函数、this的更多相关文章

  1. 深入理解JavaScript执行上下文、函数堆栈、提升的概念

    本文内容主要转载自以下两位作者的文章,如有侵权请联系我删除: https://feclub.cn/post/content/ec_ecs_hosting http://blog.csdn.net/hi ...

  2. 通俗易懂的来讲讲js的函数执行上下文

    0.开场白 在平时编写JavaScript代码时,我们并不会和执行上下文直接接触,但是想要彻底搞懂JavaScript函数的话,执行上下文是我们绕不过去的一个知识点. 1.执行上下文栈 JavaScr ...

  3. javascript 执行上下文的理解

    首先,为什么某些函数以及变量在没有被声明以前就可以被使用,javascript引擎内部在执行代码以前到底做了些什么?这里,想信大家都会想到,变量声明提前这个概念: 但是,以下我要讲的是,声明提前的这个 ...

  4. Javascript本质第二篇:执行上下文

    在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...

  5. javascript系列之执行上下文

    原文:javascript系列之执行上下文 写在前面:一 直想系统的总结一下学过的javascript知识,喜欢这门语言也热爱这门语言.未来想从事前端方面的工作,提前把自己的知识梳理一下.前面写了些 ...

  6. JavaScript我学之八善变的this---函数执行上下文

    本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘. 函数执行上下文 当函数运行时,通过this,函数可以获取它运行所需的外界环境的相关信息(比如某变量的值,另一个对象的引用等). this引用 ...

  7. js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?

    日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...

  8. js执行上下文

    js在执行是会有一个“准备工作”: 主要内容有 1.变量.函数表达式——>变量声明,默认赋值为undefined: 2.this——>赋值: 3.函数声明——>赋值: 这三种数据的准 ...

  9. 【深入理解javascript】执行上下文

    参考原文:执行上下文 1.每一个执行上下文,工作分为三个阶段: 准备阶段–>执行阶段–>调用阶段 准备阶段:代码执行之前,设置数据,相当于初始化. 执行阶段:开始执行每一行代码. 调用阶段 ...

随机推荐

  1. 【转】OkHttp使用进阶 译自OkHttp Github官方教程

    作者:GavinCT 出处:http://www.cnblogs.com/ct2011/ 英文版原版地址 Recipes · square/okhttp Wiki 同步get 下载一个文件,打印他的响 ...

  2. 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1

    ************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...

  3. [转]纯js导出json到excel(支持chrome)

    转自:http://blog.csdn.net/educast/article/details/52775559 function JSONToExcelConvertor(JSONData, Fil ...

  4. 优秀iOS文章集合

    Runtime 10种用法(没有比这更全的了成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)iOS逆向Reveal查看任意app 的界面JSPatch (实时修复App Store bu ...

  5. Android蓝牙自动配对Demo,亲测好使!!!

    蓝牙自动配对,即搜索到其它蓝牙设备之后直接进行配对,不需要弹出配对确认框或者密钥输入框. 转载请注明出处http://blog.csdn.net/qq_25827845/article/details ...

  6. OA电子表单设计-年假申请单-数据验证

    OA从年初上线到现在已经过去半年了,时光飞逝. 上月底,行政文员找到我,说最近有新来的部门文员填<年假申请单>时,有乱填的情况,让我想办法处理. 我一查还真是,这文员是个男的,同一天给同一 ...

  7. 如何优雅地使用Markdown (Sublime 3 + MarkdownEditing+OmniMarkupPreviewer)

    最近开始上手Sublime 3 作为Markdown 的重度使用者自然关于Markdown的插件是必不可少的 . 在这里记录分享一下我常用的两款Markdown插件. MarkdownEditing ...

  8. [转]Tomcat7基于Redis的Session共享

    转自:http://blog.csdn.net/catoop/article/details/48603891 目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均 ...

  9. Java基础之Map的遍历

    遍历Map集合,有四种方法:   public static void main(String[] args) { Map<String, String> map = new HashMa ...

  10. .Net程序员应该掌握的正则表达式

    Regular Expression Net程序员必然要掌握正则的核心内容:匹配.提取.替换.常用元字符. 正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现. 常用元字符 . ...