执行上下文--变量、函数、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.每一个执行上下文,工作分为三个阶段: 准备阶段–>执行阶段–>调用阶段 准备阶段:代码执行之前,设置数据,相当于初始化. 执行阶段:开始执行每一行代码. 调用阶段 ... 
随机推荐
- vue.js与angular.js的区别(个人)
			刚进入实训 讲师就要发一些什么比较高大上的东西,本人才疏学浅 浅浅的分享一下angularjs 和vue.js的区别.只是简单的理解一下 大神勿喷. 生实训之前学习的angular.js 只是理解了 ... 
- 26_线程池_ThreadPoolExecutor
			[ThreadPoolExecutor简述] 无论是Executors类的newFixedThreadPool().newSingleThreadExecutor(),还是newCachedThrea ... 
- CentOS release 6.5 yum安装报错
			单独安装如下任何一个包都会报依赖错误,需要一起安装才可以 rpm -ivh yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm yum-3.2.29-4 ... 
- July 02nd 2017 Week 27th Sunday
			No safe wading in an unknown water. 未知水深浅,涉水有危险. Is this the theory that has been the guideline for ... 
- 如何用SAP Cloud for Customer的手机App创建销售订单
			第一次启动App,设置一个初始化的pin code: 输入C4C tenant的url,用户名和密码: 登录进系统后,找到Sales Order工作中心: 可以看到系统里很多已有的销售订单了.点击屏幕 ... 
- monodevelop 基础用法
			1.mono快捷键 CTRL+K 删除光标所在行的该行后面的代码 CTRL + ALT +C 注释/不注释该行 CTRL+ DOWN 像鼠标滚轮一样向下拖 CTRL + UP 像鼠标滚 ... 
- D3——基本知识点
			选择器: d3.select - 从当前文档中选择一个元素 d3.selectAll - 从当前文档中选择多个元素 selection.append - 创建并追加一个新元素 selection.at ... 
- codeforces 797 E. Array Queries【dp,暴力】
			题目链接:codeforces 797 E. Array Queries 题意:给你一个长度为n的数组a,和q个询问,每次询问为(p,k),相应的把p转换为p+a[p]+k,直到p > n为 ... 
- sort给文件按照大小排序
			ls -l|sort -n -k5 -n 表示以数值排序-k5 表示以第几列排序还可以用 -t参数指定行内容的分隔符 参考链接:http://www.cnblogs.com/myd620/p/6002 ... 
- checkbox的readonly属性设置
			方式一: checkbox没有readOnly属性,如果使用disabled=“disabled”属性的话,会让checkbox变成灰色的,用户很反感这种样式可以这样让它保持只读: 设置它的oncli ... 
