本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘。

函数执行上下文

当函数运行时,通过this,函数可以获取它运行所需的外界环境的相关信息(比如某变量的值,另一个对象的引用等)。

this引用的对象会”变的”!

每次对函数的调用都有一个上下文对象,this关键字引用它。如果函数归属于某个对象,则this关键字将引用此对象,它就是本次函数调用的上下文。

         var obj = {
func: function () {
console.info("func():this=" + this);
}
};
obj.func();//func():this=[object Object]
var ref = obj.func;
ref();//func():this=[object Window]

函数对象的call方法

  • 所有函数都有一个call方法,此方法可以动态地指定函数调用的上下文对象(this引用它)
  • call方法的第一个参数代表本函数运行时的上下文对象,后面跟的参数函数调用的实参(如果有的话)。
         window.color = "red";
var o = { color: "blue" };
function sayColor() {
console.info(this,this.color);
}
sayColor(); //window "red"
sayColor.call(this); //window "red"
sayColor.call(window); //window "red"
sayColor.call(o); //Object "blue"

函数对象的apply方法

  • call可以接收可变数目的参数,而apply仅能接收两个参数,第一个是context对象,另一个是参数数组,数组中可以包容多个参数。
  • apply方法 参数为context对象与数组
       function Person(name) {
this.name = name; //this.name 属性Person对象,而name 是实参,两个虽同名但是不同个体。
}
var say = function (message) {
console.info((this.name || '无名氏') +
"说:“" + (message || '我什么也不想说了') + "”。");
}
say(); //无名氏 说:“ 我什么也不想说了“
var p1 = new Person("qiu");
say.apply(p1, ["这是qiu说滴"]); //qiu说:“这是qiu说滴”。
window.name = "唐僧";
say.apply(null, ["你想说你就说嘛,你不说我就说了"]); //唐僧说:“你想说你就说嘛,你不说我就说了”。

回调函数中的this

被回调函数showTime的执行上下文,与回调函数setInterval的一致,都是window.示例

         <h4 id="output"></h4>
<script type="text/javascript">
////什么是回调?
var output = document.getElementById('output');
//被回调的函数
function showTime() {
console.info(this);
if (!!output) { //转换成boolean值
output.innerHTML = new Date().toLocaleString();
}
}
//负责回调的函数
setInterval(showTime, 1000);
</script>

回调函数的执行上下文对象

那么问题来了,当回调一个对象的方法时,如果此方法需要访问对象中的属性会怎么样?

         var obj = {
outputElem: document.getElementById('output'),
showTime: function () {
this.outputElem.innerHTML = new Date().toLocaleString();
}
};
//当回调一个对象的方法时,如果此方法需要访问对象中的属性
//则会报告出错
setInterval(obj.showTime, 1000);

window对象中没有outputElem属性,因此,showTime()方法执行出错!

必须使用bind()方法,指定回调 函数在特定的上下文对象上执行。

       //设定被回调的函数,绑定到obj上
var callbackFunc = obj.showTime.bind(obj);
////现在工作正常了!
setInterval(callbackFunc, 1000);

JavaScript我学之八善变的this---函数执行上下文的更多相关文章

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

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

  2. javascript 函数执行上下文

    在js里,每个函数都有一个执行的上下文,我们可以通过this来访问. 如: 全局函数 function test(){ var local = this; } 我们发现local等于window(do ...

  3. JavaScript delete用法,属性,特性,执行上下文,激活对象 综合篇

    一.问题的提出 我们先来看看下面几段代码,要注意的是,以下代码不要在浏览器的开发者工具(如FireBug.Chrome Developer tool)中运行,原因后面会说明: 为什么我们可以删除对象的 ...

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

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

  5. javascript 执行上下文的理解

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

  6. 【进阶1-2期】JavaScript深入之执行上下文栈和变量对象(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/hZIpnkKqdQgQnK1BcrH6Nw 阅读笔记 JS是单线程的语言,执行顺序肯定是顺 ...

  7. JavaScript学习系列之执行上下文与变量对象篇

    一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 在上一篇文章中讲解了JavaScript内存模型,其中有提到执行上下文与变量对象的概念.对于JavaScript开发者来说,理解执行上下文与变 ...

  8. Javascript 执行上下文 context&scope

    执行上下文(Execution context) 执行上下文可以认为是 代码的执行环境. 1 当代码被载入的时候,js解释器 创建一个 全局的执行上下文. 2 当执行函数时,会创建一个 函数的执行上下 ...

  9. 《浏览器工作原理与实践》<11>this:从JavaScript执行上下文的视角讲清楚this

    在上篇文章中,我们讲了词法作用域.作用域链以及闭包,接下来我们分析一下这段代码: var bar = { myName:"time.geekbang.com", printName ...

随机推荐

  1. Vue CLI 3使用:浏览器兼容性

    package.json 文件里的 browserslist 字段 (或一个单独的 .browserslistrc 文件),指定了项目的目标浏览器的范围.这个值会被 @babel/preset-env ...

  2. [模板] 快速傅里叶变换/FFT/NTT

    简介 FFT是多项式乘法的一种快速算法, 时间复杂度 \(O(n \log n)\). FFT可以用于求解形如\(C_i = \sum_{j=0}^i A_jB_{i-j}\)的式子. 如果下标有偏差 ...

  3. Magento2 API 服务合同设计模式 依赖注入 介绍

    公共接口和API 什么是公共界面? 一个公共接口是一组代码,第三方开发者可以调用,实现或构建一个 插件 .Magento保证在没有重大版本更改的情况下,此代码在后续版本中不会更改. 模块的公共接口 标 ...

  4. lombok系列(一)

    如果在类上面使用@Builder注解, @Builder public class A { } controller中使用: public String test(@RequestBody A a){ ...

  5. jmeter循环控制器加jdbc req结果配合组合参数遍历

    jdbc请求:jdbc sampler  保存结果中三个变量名 循环控制器:xhkzq     的循环次数填写:${其中一个变量名_#} 循环控制器里面:http sampler ,前置处理器,取消c ...

  6. function Language

    什么是函数式语言: 函数式语言(functional language)一类程序设计语言.是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据 ...

  7. Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档

    Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.hparm        # 它用来在基于 Linux的系统上获取或 ...

  8. 金融量化分析【day110】:NumPy通用函数

    一.通用函数 能同时对数组中所有元素进行运算的函数 1.一元函数 1.sqrt 2.ceil 3.modf 4.isnan 5.abs 2.二元函数 1.maxinum 二.数学和统计方法 1.sum ...

  9. npm install 之前做的事

    在一个项目目录中,npm install之前,需要npm init,npm init会问你几个问题,有的需要输入,不想输入的一路回车就行,之后会自动创建一个package.json文件,有了这个pac ...

  10. 适配器模式-Adapter(Java实现)

    适配器模式-Adapter 是作为两个不兼容的接口之间的桥梁. 本篇文章的代码github地址: https://github.com/GoldArowana/design-patterns/tree ...