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对象 ...
随机推荐
- 003---socket介绍
socket介绍 什么是socket? socket是应用层与tcp/ip协议族通信的中间软件抽象层,它是一组接口.在设计模式中.其实就是一个门面模式.我们无需深入理解tcp/udp协议,socket ...
- node Cookie
代码: const express = require('express'); const cookieParser = require('cookie-parser'); const app = e ...
- Python3乘法口诀表(由上至下+由下至上)
一.所用知识点: 1.变量的使用. 2.循环语句的使用,这里用到的是双while循环.当然,使用其他的循环去做也是可以的.我认为,对于刚刚接触编程的人来说,使用双while循环比较容易理解. 3.使用 ...
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
- Git的升级版本
关于升级版本,例如我们要升级service版本,我们可以这样子操作 1.在master里面pull完了之后,到自己的分支,然后merge master里面的代码,然后把pom文件 里面的版本升一级,然 ...
- @Transactional spring 事务失效(转载)
原文地址:http://hwak.iteye.com/blog/1611970 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和 ...
- 3,jieba gensim 最好别分家之最简单的相似度实现
简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能 ...
- Ubantu E325 错误的解决办法
这个错误是由于未正确关闭文本编辑器导致的: 图一 解决办法:退出后输入 sudo vim /etc/hosts 图二 直接输入 D 即可! 注意:退出文本编辑器的正确方式是:ESC键 + :wq. 我 ...
- 第三十五篇 类的内置属性(attr属性),包装和授权,__getattr__
双下划线开头的attr方法,都是类内置的方法. 一. 如果没有在类里定义这三个方法,调用的时候就调用类内置的默认的方法 class Too: pass # 类没有定义这三个属性,就用系统默认的方法 t ...
- Python简要标准库(3)
shelve 若只需要一个简单的存储方案,那么shelve模块可以满足你大部分的需要,你所需要的只是为它提供文件名.shelve中唯一有趣的函数是open,在调用的时候他会返回一个Shelf对象 注意 ...