一、this的意义
二、寻找this绑定对象

经常听到这么一句话,找this只需要看谁是调用方。当函数被调用时会记录函数调用调用方式、传参包括this等各种属性。有时候this绑定对象情况太抽象,找到准确的调用方还是有一定的难度。我罗列出个人寻找普通函数this的步骤:

// 1. 通过函数调用栈寻找其调用位置;

// 2. 判断函数是否时通过new绑定的。如果是,则直接认定this指向新创建的对象。否则查看第3步;
function Staff(name) {
this.name = name;
this.clog = function() {
console.log('this.name', this.name);
}
}
const Coder = new Staff('xiaobe'); // this指向Coder
Coder.clog(); // 3. 判断函数是否使用了call、apply、bind等显式绑定方法。如果是,则指向传入绑定的对象。否则查看第4步;
const Coder = {
cname: 'xiaobe', // 全局存在name字段,为避免混淆,使用cname
}
function clog() {
console.log('this.cname ==>', this.cname);
}
clog(); // this指向Window 打印undefined
clog.call(Coder); // this指向Coder 打印xiaobe // 4. 判断函数是否被隐式(上下文)调用,如果有,则指向上下文。否则查看第5步:
const Coder = {
cname: 'xiaobe',
clog,
}
function clog() {
console.log('this', this);
console.log('this.cname', this.cname);
}
Coder.clog(); // 5. 如果上述情况都未出现,则会出现默认绑定。非严格模式下,指向Window。严格模式下指向undefined;
function Coder(){
console.log('this', this);
}
Coder(); // 毋庸置疑,指向Window
三、找到调用栈&调用位置

看个例子: 分别找到StaffCoderSkill调用栈调用位置

 function Staff() {
StaffData.Coder();
}
function Coder() {
Skill();
}
function Skill() { }
Staff();

调用栈:执行当前函数前所需要调用的所有函数(所有作用域)的顺序,加上自身

调用位置:当前函数在哪里被执行/调用

调用位置通常在调用栈的倒数第二个

通过以上概念我们很容易得出:

Staff: {
调用栈: Staff
调用位置: Window
} Coder: {
调用栈: Staff => Coder
调用位置: Staff
} Skill: {
调用位置: Staff => Coder => Skill
调用位置: Coder
}

我们可以通过在函数里执行debugger可以查看到当前函数的调用栈,例如

function Coder(){
debugger;
// ...
}

四、箭头函数&全局方法

JS进阶——this绑定了谁?的更多相关文章

  1. js进阶---12-11、jquery如何给动态创建出来的元素绑定事件

    js进阶---12-11.jquery如何给动态创建出来的元素绑定事件 一.总结 一句话总结:通过事件委托的方式,通过on方法 1.on方法在事件绑定的时候,data方式带额外参数时,字符串参数和其它 ...

  2. js进阶---12-10、jquery绑定事件和解绑事件是什么

    js进阶---12-10.jquery绑定事件和解绑事件是什么 一.总结 一句话总结:on和off. 1.jquery如何给元素绑定事件? on方法 22 $('#btn1').on('click', ...

  3. 【 D3.js 进阶系列 】 进阶总结

    进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟 ...

  4. JS 进阶知识点及常考面试题

    将会学习到一些原理相关的知识,不会解释涉及到的知识点的作用及用法,如果大家对于这些内容还不怎么熟悉,推荐先去学习相关的知识点内容再来学习原理知识. 手写 call.apply 及 bind 函数 涉及 ...

  5. js进阶---12-12、jquery事件委托怎么使用

    js进阶---12-12.jquery事件委托怎么使用 一.总结 一句话总结:通过on方法(事件委托),给要绑定事件的元素的祖先绑定事件,从而达到效果. 1.事件委托是什么? 通过事件冒泡,让子元素绑 ...

  6. Node.js进阶篇-koa、钩子函数、websocket、嵌入式开发

    代码地址如下:http://www.demodashi.com/demo/12932.html 一.简介     koa是由Express原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的We ...

  7. js进阶 12-17 jquery实现鼠标左键按下拖拽功能

    js进阶 12-17 jquery实现鼠标左键按下拖拽功能 一.总结 一句话总结:监听的对象必须是文档,鼠标按下运行mousemove事件,鼠标松开取消mousemove事件的绑定,div的偏移的话是 ...

  8. js进阶 12 jquery事件汇总

    js进阶 12 jquery事件汇总 一.常用事件 页面载入事件 ready() 文档就绪事件(当 HTML 文档就绪可用时) 鼠标事件 click() 触发.或将函数绑定到指定元素的 click 事 ...

  9. js进阶 12-14 jquery的事件触发函数是哪两个

    js进阶 12-14 jquery的事件触发函数是哪两个 一.总结 一句话总结:trigger和triggerHandler 1.trigger传额外参数时候的注意事项是什么? 注意样例中是三个参数 ...

随机推荐

  1. MySQL按天,按周,按月,按时间段统计【转载】

    自己做过MySQL按天,按周,按月,按时间段统计,但是不怎么满意,后来找到这位大神的博客,转载一下,谢谢这位博主的分享 知识点:DATE_FORMAT 使用示例 select DATE_FORMAT( ...

  2. oracle trunc(d1[,c1])

    [功能]:返回日期d1所在期间(参数c1)的第一天日期 [参数]:d1日期型,c1为字符型(参数),c1默认为j(即当前日期) [参数表]:c1对应的参数表: 最近0点日期: 取消参数c1或j 最近的 ...

  3. @codechef - TREEPATH@ Decompose the Tree

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵无根树,每个节点上都写了一个整数. 你的任务就是统计有多 ...

  4. 求eclipse中的java build path 详解

    我也找了一下资料,但未找到相关的正式说明,我只能凭经验告诉你. 1,Source是指资源的路径.例如在没有包含res之前,资源是放在与src同级位置,或者通过/res/*.*来操作的.2,Projec ...

  5. Docker 领衔 OpenSource.com 2014十佳开源软件排行榜

    Docker 领衔 OpenSource.com 2014十佳开源软件排行榜 每年 Opensource.com 都会收集最佳的十个开源软件,今年也不例外,废话不多说,直接进入主题. Docker 应 ...

  6. H3C 802.11无线网络的介质访问控制

  7. 将 vue.js 获取的 html 文本转化为纯文本

    我存入数据表中的数据是使用 html  格式,获取数据是使用 vue 获取. 遇到了一个问题,就是界面上显示的数据是 html 格式的,但是我需要它显示纯文本. 怎么做呢?首先在  js  中写一个将 ...

  8. 分布式TensorFlow集群local server使用详解

    通过local server理解分布式TensorFlow集群的应用与实现. ​​简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...

  9. 原生js设置audio在谷歌浏览器自动播放

    https://www.cnblogs.com/sandraryan/ 谷歌浏览器更新后禁止了autoplay功能,但是有时候可能会需要自动播放. 研究了一段代码. <!DOCTYPE html ...

  10. 2018-8-10-UWP-分享用那个图标

    title author date CreateTime categories UWP 分享用那个图标 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:2 ...