this到底指向哪里
this指向调用它的对象
首先要明确,this指向调用方,谁调用,this指向谁。
直接调用
举个栗子:
var
test = 'window'
;
function testThis () {
var test = 'inner';
this.test = 'test change';
console.log(this.test)
}
testThis(); // test change
console.log(window.test) // test change
在chrome中执行后可以发现,外部挂在window下的test被修改了,因为这个testThis的函数,是被window调用的,它只会读取window下的test。
构造函数调用
再举个栗子:
var
test = 'window'
;
function testThis () {
var test = 'inner';
console.log(this.test)
this.test = 'test change';
console.log(this.test)
}
var newTestThis = new testThis();
// undefined
// test change
console.log(window.test) // window
在chrome中执行以下可以发现,依次输出undefined、test change、window。
这个栗子与上面的区别在于调用了new。此时,该函数作为构造函数调用,我们都知道,构造函数中的this都指向new出来的对象。所以this指向了这个新生成的newTestThis。自然地,window下test就没有被修改。
嵌套调用
接下来举一个栗子,来说明在函数嵌套调用时的this指向:
var x = 'global'
function testThis () {
// this.x = 'fuck';
// console.log(this)
console.log(this.x)
}
function innerObj () {
this.x = 'inner';
testThis();
this.innerTestThis = testThis;
this.innerTestThis();
}
function wrapObj () {
this.x = 'wrap';
// var test = new testThis();
// console.log(test.x)
testThis();
this.wrapTestThis = testThis;
this.wrapTestThis();
this.innerTestThis = new innerObj();
}
var wrap = new wrapObj();
wrapObj();
// global
// wrap
// global
// inner
// wrap
// wrap
// wrap
// inner
很明显,在函数嵌套时,如果不给函数指定调用对象,则不论被调用函数是在哪个函数的作用域里,被调用的函数的this都是指向window的。
我们可以这样理解,在直接调用时,这些函数除了拥有自己的作用域外,就像是把这几行代码写到了相应的位置。可以想一下,所有的js代码最后都拼到一起,很明显,他们的调用方都是window。
总结一下:1.不论函数在哪里被调用,只要没有指定调用方,则this都指向window。指定了调用方,就指向调用方。2.作为构造函数中调用,this指向新生成的对象。
分析一下:setTimeout和setInterval
bind的作用就是给函数一个指定的thisArg,经常使用bind的地方就是setTimeout和setInterval了。为什么呢?
setTimeout和setInterval都有一个特点,它会将回调函数的作用域转移到window上面。其实结合我们上面说的,很容易知道为什么。
以setTimeout为例:翻看MDN下setTimeout的定义,可以发现,setTimeout是把一段callback代码延迟执行。写过callback的同学都知道,callback的代码其实就是占了位,然后去调用一行行的代码,所以,callback中的this也会指向window。
实际开发中,我们不希望this指向window,故而常使用bind来使this指向我们希望的对象。
bind、apply、call
说到了bind,就还需要提一下另外的可以改变this指向的方法:apply和call。
这两个函数大同小异,只是传参有区别。不论使用apply还是call,都会传入一个thisArg,作为函数调用方,让函数中的this指向thisArg。
在下一篇,我会介绍一下apply和call。
this到底指向哪里的更多相关文章
- javaScript中this到底指向谁
1.前言 在JavaScript中,this的指向一直是大多数初学者的易错点,总是搞不清楚this到底指向谁,而在求职面试中,this的指向问题往往又是高频考点.本篇博文就来总结一下在JavaScri ...
- this, 你到底指向谁?
JS中, this的值到底是什么? 几个月之前, 拜读了<javascript语言精髓>, 里面对于这个问题, 做出了很好的解释... JS中, this的值取决于调用的模式, 而JS中共 ...
- js 中this到底指向哪里?
其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=2 ...
- JS中this到底指向谁?
关于this的指向,是一个令人很头疼的问题.但是,你运气好,碰到了我.老夫这儿有本祖传秘籍,看懂这个,妈妈再也不用担心你的this指向不对啦! 归根结底,this指向就一句话:谁最终调用函数,this ...
- Groovy中Closure的this到底指向谁?
Groovy in Action(中文版)第136页明确说Closure的this指向Closure自己.并且从代码注释处作者也是这样理解的: class Mother{ int field = ...
- JavaScript的this指针到底指向哪?
编程过程中,着实十分困扰this的指向性,经过查阅一番资料,终于搞清楚了,在这里总结一下,全文分为以下三个部分: 什么是this指针? this指针指向哪里? 何时使用this? 一 什么是this指 ...
- this 到底指向谁
this 的指向,是在调用函数时根据执行上下文所动态确定的. 在函数体中,简单调用该函数时(非显式/隐式绑定下),严格模式下 this 绑定到 undefined,否则绑定到全局对象 window/g ...
- 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题
setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...
- what's this? 浅谈js中this的指向问题
刚刚学习js的朋友可能和我一样,看到代码中的this总是一脸懵逼,不知道this到底指向谁.经过一段时间的了解,我想跟大家分享下自己的理解. 何时出现this 函数在调用的时候,会自动获得两个特殊变量 ...
随机推荐
- Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)
注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...
- Winform控件输入的字母转换成大写
private void textBoxHbh_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar >= 'a' & ...
- oracle12之 多租户容器数据库架构
解读: 这张幻灯片展示了三个被部署的应用程序的整合 三个不同的非cdbs成为一个单一的.幻灯片中的图形显示了一个多租户 容器数据库有四个容器:根和三个可插入的数据库.每一个 可插入数据库有它自己的专用 ...
- windows 下 Mutex和Critical Section 区别和使用
Mutex和Critical Section都是主要用于限制多线程(Multithread)对全局或共享的变量.对象或内存空间的访问.下面是其主要的异同点(不同的地方用黑色表示). Mutex Cri ...
- 201521123006 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口与抽象类拥有相同之处:(1)都代表系统的抽象层. (2)都不能被实例化(不能 ...
- 201521123059 《Java程序设计》第十周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 多线程的相关理解图: 2. 书面作业 本次PTA作业题集异常.多线程 Q1:finally 题目4-2 1. ...
- page分页类
<?php /** file: Page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 private $lis ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- python基础之元组,集合
一.元组 为何要有元组,存放多个值,元组不可变,更多的是用来做查询 t=(,[,],,)) #t=tuple((,[,],,))) print(type(t)) 元组可以作为字典的key d={(,, ...
- 框架应用:Mybatis (三) - 关系映射
你有一张你自己的学生证?(一对一) 你这一年级有多少个学生?(一对多) 班上学生各选了什么课?(多对多) 两张表以上的操作都需要联立多张表,而用SQL语句可以直接联立两张表,用工程语言则需要手动完成这 ...