执行上下文--变量、函数、this
原文地址:https://www.xingkongbj.com/blog/js/execution-context.html
变量提升
- 变量的定义在代码预解析时,在作用域顶部定义
- 无 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的更多相关文章
- 深入理解JavaScript执行上下文、函数堆栈、提升的概念
本文内容主要转载自以下两位作者的文章,如有侵权请联系我删除: https://feclub.cn/post/content/ec_ecs_hosting http://blog.csdn.net/hi ...
- 通俗易懂的来讲讲js的函数执行上下文
0.开场白 在平时编写JavaScript代码时,我们并不会和执行上下文直接接触,但是想要彻底搞懂JavaScript函数的话,执行上下文是我们绕不过去的一个知识点. 1.执行上下文栈 JavaScr ...
- javascript 执行上下文的理解
首先,为什么某些函数以及变量在没有被声明以前就可以被使用,javascript引擎内部在执行代码以前到底做了些什么?这里,想信大家都会想到,变量声明提前这个概念: 但是,以下我要讲的是,声明提前的这个 ...
- Javascript本质第二篇:执行上下文
在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...
- javascript系列之执行上下文
原文:javascript系列之执行上下文 写在前面:一 直想系统的总结一下学过的javascript知识,喜欢这门语言也热爱这门语言.未来想从事前端方面的工作,提前把自己的知识梳理一下.前面写了些 ...
- JavaScript我学之八善变的this---函数执行上下文
本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘. 函数执行上下文 当函数运行时,通过this,函数可以获取它运行所需的外界环境的相关信息(比如某变量的值,另一个对象的引用等). this引用 ...
- js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?
日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...
- js执行上下文
js在执行是会有一个“准备工作”: 主要内容有 1.变量.函数表达式——>变量声明,默认赋值为undefined: 2.this——>赋值: 3.函数声明——>赋值: 这三种数据的准 ...
- 【深入理解javascript】执行上下文
参考原文:执行上下文 1.每一个执行上下文,工作分为三个阶段: 准备阶段–>执行阶段–>调用阶段 准备阶段:代码执行之前,设置数据,相当于初始化. 执行阶段:开始执行每一行代码. 调用阶段 ...
随机推荐
- avalon2简单数据绑定(自定义属性绑定)
<!DOCTYPE html> <html> <head> <title>项目</title> <meta charset=" ...
- Django—middleware
一.Django中间件的请求周期 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通过中 ...
- Linux基础之命令练习Day1-init,who,date,cal,man,clear,passwd,su,whoami,mkdir,touch,rm,cp,mv,head,tail,more,less,echo
开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 使用命令退出虚拟终端2上登录的用户 使用快捷键切 ...
- Linux下C语言操作MySQL数据库
MySQL是Linux系统下广泛使用的开源免费数据库,是Linux应用程序数据存储的首选. Ubuntu下安装 […]
- intellij-maven-imports-have-broken-classpath
公司自己搭得maven私服,然后使用git下载 公司mvn的依赖包时候,报错: 之后再idea里面发现依赖的jar包 有红色的错误信息,提示 maven imports have broken cla ...
- Android学习——自定义控件(二)
这篇文章来介绍自定义组合控件,自定义组合控件的应用场景很多,比如当你的UI如下时: 倘若不使用组合控件,则需要在XML文件中声明4个TextView和4个EditText,而使用了组合控件,则只需要四 ...
- Hadoop High Availability高可用
HDFS HA Namenode HA 详解 hadoop2.x 之后,Clouera 提出了 QJM/Qurom Journal Manager,这是一个基于 Paxos 算法(分布式一致性算法) ...
- SQL点点滴滴_DELETE小计
惨痛的教训: 某次在执行delete时,一时疏忽忘记写where条件了, 1.删除tb_mobile_cust_micromsg中的内容,前提是c_customer这个字段的值与#datamod表中c ...
- Visio2010新建E-R图
visio2010没有内置E-R图的模板,需要自己配置模具.步骤如下: 1.文件->新建->基本流程图->右键菱形->添加到新模具->命名为E-R图. 2.更多形状-&g ...
- gmock使用、原理及源码分析
1 初识gmock 1.1 什么是Mock 便捷的模拟对象的方法. 1.2 Google Mock概述 google mock是用来配合google test对C++项目 ...