JS中this的指向问题(读书笔记纯手打~)
一、this
JavaScrip的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境。
二、this的指向
根据运用情景可分为四类:
1.作为对象的方法调用;
2.作为普通函数调用;
3.构造器调用;
4.Function.prototype.call或Function.prototype.apply调用。
1.作为对象的方法调用:
当函数作为对象的方法被调用时,this指向该对象:
var obj = {
a :1,
getA:function () {
alert(this === obj);//true
alert(this.a) //1
}
};
obj.getA();
2.作为普通函数调用;
当函数不作为对象的属性被调用时,即该函数为普通函数时,此时this的指向时全局对象,在浏览器的js中,这个全局对象也就是window。
window.name = 'hello world';
var getName = function () {
return this.name;
}
console.log(getName());//hello world
或
window.name = 'hello world';
var obj = {
name : 'ling',
getName : function () {
return this.name;
}
};
var getName = obj.getName;
console.log(getName()); //hello world
console.log('obj----'+obj.getName());//obj----ling
那么怎么解决这个问题呢。。。。。在书上居然也讲了我之前写前端时公司老同志教我的方法,哈哈哈~~~那就是“that”大法!
//假设节点id为abc
window.id = 'ling';
document.getElementById('ling').onclick = function () {
alert(this.id); //abc
var callback = function () {
alert(this.id);//ling
}
callback();
};
方法如下~~
//假设节点id为abc
window.id = 'ling';
document.getElementById('ling').onclick = function () {
var that = this;
var callback = function () {
alert(that.id);//abc
}
callback();
};
3.构造器调用;
js中没有类,但是我们可以从构造器中创建对象,同时也提供了new运算符使得构造器看起来更像一个类。
当使用new运算符调用函数时,该函数总会返回一个对象,通常情况下。构造器里的this就指向这个返回的对象。
var MyClass = function () {
this.name = 'ling';
}
var obj = new MyClass();
console.log(obj.name);//ling
但是要特别注意如果函数显示地返回一个对象,那么this指的便是这个显示对象。若显示返回的是非对象类型(string等),则不会出现下面的问题。
var MyClass = function () {
this.name = 'ling';
return {
a : 'abc'
};
}
var obj = new MyClass();
console.log(obj.name);//undefined
console.log(obj.a);//abc
4.Function.prototype.call或Function.prototype.apply调用。
与普通函数相比,用call()和apply()可以动态改变传入函数的this指向。
var obj1 = {
name: 'ling',
getName : function () {
return this.name
}
}
var obj2 = {
name : 'abc'
}
console.log(obj1.getName());//ling
console.log(obj1.getName.call(obj2));//abc
JS中this的指向问题(读书笔记纯手打~)的更多相关文章
- 轻松了解JS中this的指向
JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向 ...
- 理解js中this的指向
学习自原文 http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...
- js中this的指向
在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...
- JS中的this 指向问题
我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- js中 this 的指向
js中 this的指向一共存在3种地方: 1.全局的this; 2.构造函数的this; 3.call/apply; 一.全局的this: function test(){ this.d = 3;// ...
- 彻底理解js中this的指向,不必硬背。
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- 了解学习JS中this的指向
[转] 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问 ...
- JS中this的指向问题
JS中this的定义:this对象是在运行时基于函数的执行环境绑定的(通俗点来说就是:this代表当前函数属于哪个对象). this一般情况下都代表的是global对象,在浏览器中就是window对象 ...
随机推荐
- R语言学习笔记(五):零碎知识点(11-15)
11--which.min(), which.max()和which() which(x, arr.ind = FALSE, useNames = TRUE) x 是一个向量或者数组,可以是NA,但会 ...
- 使用localStorage,sessionStorage,cookie等存储
Web 存储 API 提供了 sessionStorage (会话存储) 和 localStorage(本地存储)两个存储对象来对网页的数据进行添加.删除.修改.查询操作. 特点: localStor ...
- 初步学习pg_control文件之七
接前文 初步学习pg_control文件之六 看 pg_control_version 以PostgreSQL9.1.1为了,其HISTORY文件中有如下的内容: Release Release ...
- 【Consul】Consul架构-Gossip协议
Consul使用gossip协议管理成员关系.广播消息到整个集群.详情可参考Serf library,Serf使用到的gossip协议可以参阅"SWIM: Scalable Weakly-c ...
- 8.Mongodb备份与恢复
1.备份 语法 mongodump -h dbhost -d dbname -o dbdirectory -h:服务器地址,也可以指定端口号 -d:需要备份的数据库名称 -o:备份的数据存放位置,此目 ...
- Python的logging模块、os模块、commands模块与sys模块
一.logging模块 import logging logging.debug('This is debug message') logging.info('This is info message ...
- 思杰VDI提示“The VDI is not available”
前言:困扰已久的问题终于解决. 问题:客户反馈无法连接VDI. 解决过程:1.登录后台查看VDI状态为关机状态尝试重新启动提示如下图: 2.判断此VDI的启动盘出现问题(注:本人环境无数据盘) 3.查 ...
- 第二十篇 sys模块
修改环境变量 import sys sys.path.append() 但是,这种修复方式只是临时修改 如果要永久修改,就要电脑里配置环境变量. sys.argv:命令行参数List,第一个元素是程序 ...
- 九度OJ--Q1165
import java.util.ArrayList;import java.util.Scanner; /* * 题目描述: * 读入数据string[ ],然后读入一个短字符串.要求查找strin ...
- 十分钟掌握pandas中文版(pandas官方文档翻译)
转载自 https://blog.csdn.net/jiangjiang_jian/article/details/80022918