年前最后一篇文章,提前祝大家春节快乐。对了,还有369就要2018年了,提前祝大家2018年春节快乐。


.. .vr
qBMBBBMBMY
8BBBBBOBMBMv
iMBMM5vOY:BMBBv
.r, OBM; .: rBBBBBY
vUL 7BB .;7. LBMMBBM.
.@Wwz. :uvir .i:.iLMOMOBM..
vv::r; iY. ...rv,@arqiao.
Li. i: v:.::::7vOBBMBL..
,i7: vSUi, :M7.:.,:u08OP. .
.N2k5u1ju7,.. BMGiiL7 ,i,i.
:rLjFYjvjLY7r::. ;v vr... rE8q;.:,,
751jSLXPFu5uU@guohezou.,1vjY2E8@Yizero.
BB:FMu rkM8Eq0PFjF15FZ0Xu15F25uuLuu25Gi.
ivSvvXL :v58ZOGZXF2UUkFSFkU1u125uUJUUZ,
:@kevensun. ,iY20GOXSUXkSuS2F5XXkUX5SEv.
.:i0BMBMBBOOBMUi;, ,;8PkFP5NkPXkFqPEqqkZu.
.rqMqBBMOMMBMBBBM . @kexianli.S11kFSU5q5
.7BBOi1L1MM8BBBOMBB.., 8kqS52XkkU1Uqkk1kUEJ
.;MBZ;iiMBMBMMOBBBu , 1OkS1F1X5kPP112F51kU
.rPY OMBMBBBMBB2 ,. rME5SSSFk1XPqFNkSUPZ,.
;;JuBML::r:.:.,, SZPX0SXSP5kXGNP15UBr.
L, :@huhao. :MNZqNXqSqXk2E0PSXPE .
viLBX.,,v8Bj. i:r7:, 2Zkqq0XXSNN0NOXXSXOU
:r2. rMBGBMGi .7Y, 1i::i vO0PMNNSXXEqP@Secbone.
.i1r. .jkY, vE. iY.... 20Fq0q5X5F1S2F22uuv1M;

<p>

在面试的时候,经常会出现这样的面试题目:


var obj = {
foo: function(){
console.log(this)
}
} var bar = obj.foo
obj.foo() // 打印出的 this 是 obj
bar() // 打印出的 this 是 window

初学者其实对于 this 肯定是一头雾水,甚至有一些有工作经验的伙伴,对 this 的理解也依旧很模糊。

一、理解函数的调用

函数的调用分为一下三种方式:


func(p1, p2) obj.method(p1, p2) func.call(context, p1, p2) // 先不讲 apply

其实所有的调用方式都是 func.call(context, p1, p2) 方式的<a href="http://baike.baidu.com/link?url=cPB6bTAJlEW7zqrmSlgSlubMwoCDEwgVh8DjABZxAD9kb8PurAnSHA3u0WZyImlWbRtrabRJtYiFNV_W20PuYKZYOCm9nKB63-j599cummgF6nQzDCQ5LUX1mKXOQMBc">语法糖</a>。

前面两种方式转换成 call 方式:


func(p1, p2)
=》
func.call(undefined, p1, p2) obj.method(p1, p2)
=》
obj.method.call(obj, p1, p2)

二、那 this 是什么?

上面的 context 就是 this

三、方式的转换

  • func(p1, p2) 中的 this

function func(){
console.log(this)
} func() =》 func.call(undefined) // 可以简写为 func.call()

理论上来说,打印的 this 应该就是 undefined,但是浏览器里有一条规则:

如果你传的 contextnull 或者 undefined,那么 window 对象就是默认的 context(严格模式下默认 contextundefined

因此上面的打印结果是** window**。

如果你要改变 this,那么传入新的 context 就好了:


func.call(obj) // 那么里面的 this 就是 obj 对象了
  • obj.method(p1, p2)this

var obj = {
foo: function(){
console.log(this)
}
} obj.foo() =》 obj.foo.call(obj)
this 就是 obj

四、搞定面试题,赢得高薪


var obj = {
foo: function(){
console.log(this)
}
} var bar = obj.foo
obj.foo() // 转换为 obj.foo.call(obj),this 就是 obj
bar()
// 转换为 bar.call()
// 由于没有传 context
// 所以 this 就是 undefined
// 最后浏览器给你一个默认的 this —— window 对象

五、call 和 apply 是什么关系

作用一样,传参方式所有区别而已。


func.call(func, p1, p2, p3) // this func.apply(func, [p1, p2, p3]) // apply

五、总结

1、this 就是你 call 一个函数时,传入的 context

2、callapply 功能是一样的

原文地址:https://www.jianshu.com/p/6deef2eed076

轻松搞定 JS 的this、call和apply的更多相关文章

  1. 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )

    变量:  存储数据的容器     1.声明        var   2.作用域       全局变量. 局部变量. 闭包(相对的全局变量):   3.类型         a.基本类型(undefi ...

  2. 跨域 - jsonp轻松搞定跨域请求

    1.jsonp轻松搞定跨域请求 vue中使用axios,遇到跨域我就蒙逼了.第一次真正意义上的尝试使用jsonp js中用 var myscript = document.createElement( ...

  3. 人脸识别JavaScript也可以轻松搞定

    前言 是不是觉得不可思议,js已经强大到这个地步? 是的,js日新月异,它在不断的进步.只要稍不留神,那我们都只能望尘莫及了. 今天我们就来看看是什么js插件可以如此厉害? 人脸识别JavaScrip ...

  4. 春节过后就是金三银四求职季,分享几个Java面试妙招,轻松搞定HR!

    春节过后就是金三银四,分享几个Java面试妙招,轻松搞定HR! 2020年了,先祝大家新年快乐! 今年IT职位依然相当热门,特别是Java开发岗位.软件开发人才在今年将有大量的就业机会.春节过后,金三 ...

  5. 【转】轻松搞定FTP之FlashFxp全攻略

    转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融 ...

  6. Webcast / 技术小视频制作方法——自己动手录制video轻松搞定

    Webcast / 技术小视频制作方法——自己动手录制video轻松搞定 http://blog.sina.com.cn/s/blog_67d387490100wdnh.html 最近申请加入MSP的 ...

  7. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  8. 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心

    在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...

  9. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

随机推荐

  1. range()函数在python3与python2中的区别

    range()函数在python3与python2中的区别 - CSDN博客 https://blog.csdn.net/weixin_37579123/article/details/8098038 ...

  2. C语言进阶学习第二章

    本章重点记录指针的各种概念: 1.地址与内容 2.非法的赋值 3.NULL指针:NULL指针作为一个特殊的指针变量,表示不指向任何东西,在对指针进行解引用操作之前,首先必须 确保它并非NULL指针. ...

  3. day 65 Django基础之django分页

      Django基础之django分页   一.Django的内置分页器(paginator) view from django.shortcuts import render,HttpRespons ...

  4. java获取服务器路径

    java获取服务器一些信息的方法(服务器地址/相对路径/端口/项目名字 request.getServletContext().getRealPath("/")  获取项目所在服务 ...

  5. Python第二课-输入输出

    name = input() 输入的字符串已经赋值给变量name print() 输出内容 print(,) print中,连接字符串相当于空格

  6. <每日一题>题目1:简单的注册和登录1.0

    #版本1.0,最基本的注册登录'''1.注册,将账号和密码分别写在不同的文档里面2.登录,分别从账户文档和密码文档进行读取并登录''' #注册 Identity = input("请输入您想 ...

  7. 2018-8-10-win10-uwp-使用资源在后台创建控件

    title author date CreateTime categories win10 uwp 使用资源在后台创建控件 lindexi 2018-08-10 19:17:19 +0800 2018 ...

  8. css3 随记

    1 让子元素对其的方式  box-pack 2 -webkit-text-size-adjust  解决字体大小失效问题http://www.frontopen.com/273.html 3 disp ...

  9. drupal-note2 drush运行make文件

    进入durpal项目的根目录中执行 drush make build-openpublic.make /path/to/webroot 参考: Managing Drush make files fo ...

  10. 杜教筛&套路总结

    杜教筛 \[ \begin{split} (g*f)(i)&=\sum_{d|i}g(d)f(\frac id)\\ \Rightarrow g(1)S(n)&=\sum_{i=1}^ ...