this的指向详细剖析

function Person (color){
console.log(this)
this.color = color
this.getColor = function () {
console.log(this)
console.log(this.color)
}
this.setColor = function (color){
console.log(this)
this.color = color
}
}

当作为函数直接调用时, this => window

// 当作为函数,直接调用时
// this ===> 在非严格模式下,全局对象window; 严格模式下是undefiend
Person('red') // this => window

当作为构造函数时,this => 构造出的实例对象

// 当作为构造函数时
// this ===> 构造出的实例对象
var fitz = new Person('pink') // this => fitz

当作为对象的方法调用时,this => 调用方法的那个对象

// 当作为对象的方法调用时
// this ===> 调用方法的那个对象
fitz.getColor() // this => fitz

使用call、apply、bind方法时,this => 法中指定的对象(传入的第一个参数)

// 当使用call、apply、bind方法时
// this ==> 方法中指定的对象(传入的第一个参数)
var lx = {}
fitz.setColor.call(lx, 'blue') // this => lx
console.log(lx) // lx {color: "blue"}

函数调用时无任何调用前缀,this => window

// 函数调用时无任何调用前缀
// this ==> window /*
原因: 执行func1相当于执行在函数外部执行func2()
*/
function func1 () {
function func2 () {
console.log(this)
}
func2() // 无任何调用前缀
}
func1() // this => window

箭头函数的this, this => 就是外层函数的this

准确的来说, 箭头函数自己没有this, 在箭头函数中的this会像作用域链一样像外层逐层查找, 箭头函数的this就是它外层函数的this

// 例子1
/*
这个例子中,箭头函数的this是外层函数test1的this
外层函数test1的this => window
所以console.log(this.msg) <=> console.log(window.msg)
*/
window.msg = '测试箭头函数的this'
function test1 () {
(() => {
console.log(this.msg)
})()
}
test1() // 测试箭头函数的this
// 例子2
function test2 () {
return () => {
console.log(this.name)
}
}
var obj = {
name: 'Fitz',
receiveFunc: test2()
}
var receiveFunc = test2.call(obj)
/*
执行完上述语句的状态是:
- 用call方法显示执行函数test2, 得到一个箭头函数
- 同时test2的this从window强制绑定后变成obj
*/
receiveFunc()

注意: 箭头函数的this一旦确定无法更改,但是可以通过改变外层函数的this然后曲线更改箭头函数的this

// 例子3
function test3 () {
return () => {
console.log(this)
}
}
var obj2 = {}
var receiveFunc2 = test3()
receiveFunc2.call(obj2)

关于js中this的指向详细总结、分析的更多相关文章

  1. 理解js中this的指向

         学习自原文  http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...

  2. js中this的指向

    在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...

  3. JS中的this 指向问题

    我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...

  4. 轻松了解JS中this的指向

    JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向 ...

  5. js中改变this指向的call、apply、bind 方法使用

    前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...

  6. js中 this 的指向

    js中 this的指向一共存在3种地方: 1.全局的this; 2.构造函数的this; 3.call/apply; 一.全局的this: function test(){ this.d = 3;// ...

  7. JS回调函数中的this指向(详细)

    首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun()     fun中的this->obj,自动指向.前的对 ...

  8. 彻底理解js中this的指向,不必硬背。

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  9. 了解学习JS中this的指向

    [转] 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问 ...

随机推荐

  1. 01.Numpy数组的基本应用

    数组的创建 数组的访问 数组的合并 数组的分割 数组创建 >>> import numpy as np 创建一维数组 >>> x = np.arange(10) & ...

  2. 20_MySQL表的内连接实操

    -- 查询底薪超过公司平均底薪的员工信息 -- 方法1 SELECT empno,ename FROM t_emp HAVING sal>AVG(sal); 因为在having中不能拿一个字段与 ...

  3. 小公举comm,快速比较两个排序文件

    前言 我们经常会有需求比较一个文件里的内容是否在另一个文件存在.假如我有一份监控列表的IP写入在了file1,我所有的机器IP写入在了file2,我要找出还有哪些机器没有在监控列表.以前的做法是写个两 ...

  4. Linux文本三剑客总结

    Linux文本处理三剑客 grep 文本过滤(模式:pattern)工具 grep, egrep, fgrep(不支持正则表达式搜索) grep  grep: Global search REgula ...

  5. MySQL:基本操作与常用函数

    基本操作 这里的基本操作为添加.修改.删除数据表中的记录. INSERT语句 -- 通用INSERT: INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, . ...

  6. python:虚拟环境与pip

    原生pip镜像下载速度较慢,配置使用国内镜像.这里选择清华镜像,文档地址:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ pip 镜像配置 临时使用: ...

  7. 一篇文章彻底弄懂Android-MVVM

    转: 一篇文章彻底弄懂Android-MVVM 在学习一个技术之前,我们首先要搞清为什么要用它.用它以后会有什么好处,这样我们才能有兴趣的学习下去. 一.为什么要用MVVM? 我为什么要用这个什么MV ...

  8. 巧用 -webkit-box-reflect 倒影实现各类动效

    在很久之前的一篇文章,有讲到 -webkit-box-reflect 这个属性 -- 从倒影说起,谈谈 CSS 继承 inherit -webkit-box-reflect 是一个非常有意思的属性,它 ...

  9. PUToast - 使用PopupWindow在Presentation上模拟Toast

    PUToast Android10 (API 29) 之前 Toast 组件默认只能展示在主 Display 上,PUToast 通过构造一个 PopupWindoww 在 Presentation ...

  10. SpringBoot利用spring.profiles.active=@spring.active@不同环境下灵活切换配置文件

    一.创建配置文件 配置文件结构:这里建三个配置文件,application.yml作为主配置文件配置所有共同的配置:-dev和-local分别配置两种环境下的不同配置内容,如数据库地址等. appli ...