不安分的this
不安分的this
前言:关于javascript中的this,上网一搜一大片的文章。惊!
而我个人认为要想分清this,就有必要先搞清楚“对象”。

目录:
一.函数对象的认识
二.this
一.函数对象的认识
post出概念:
每逢过节,亲戚朋友都会问,小罗你的对象呢?
这里所指的对象:是指小罗我感觉合适的某个异性。是指实体:实例。
1:小罗感觉合适(对应计算机语言就是:方法)对人友善
2:异性(属性)女人
那么回答亲戚就说:黄某某
我想表达的是,对象是指某一类人,当使用的时候是明确的某个人。
函数
插入内容,如下引用:
函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,
例如日期对象(Date)、数组对象(Array)、字符串对象 (String)都属于内部对象。
这些内置对象的构造器是由JavaScript本身所定义的:通过执行new Array()这样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。
在JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date一样,可以通过 new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。
下面两行代码都是创建一个数组对象myArray:
var myArray=[];
//等价于
var myArray=new Array();
同样,下面的两段代码也都是创建一个函数myFunction:
function myFunction(a,b){
return a+b;
}
//等价于
var myFunction=new Function("a","b","return a+b");
出自:雨中无伞V-蓝色“认识js中的function和this”
就是说:
看到用function关键字创建的,和用new Function()创建的内容称为函数对象(function)
而this就是指向函数对象。
二.this
判断this所指的具体对象方法:
step1:找到函数真正被调用执行的位置(运行时的位置)
step2:查看有没有闭包或者直接调用再或者call与apply
step3: this: 当前方法属于谁,this就是谁!
关键字词:this关键字总是返回某个具体对象。再说的详细一些,就是属性或方法“当前”所在的某个对象。(重点一)
(1)身处全局变量中
案例:
var name="全局";
function getName(){
var name="局部";
return this.name;
};
alert(getName());//全局
step1:找到函数真正被调用执行的位置(运行时的位置)
既是:
alert(getName());
step2:查看有没有闭包或者直接调用再或者call与apply
没有这些内容,不会跳了出来。
step3: this: 当前方法属于谁,this就是谁!
这里只是声明了那一类,而没有指出是哪一个人。那么就会默认指向window
则getName返回的this.name其实是window.name,因此alert出来的是“全局”!
(2)身处局部变量中
在解说之前,要插入一些内容
构造函数:
var obj = new Object();
如上,称new 调用的函数为构造函数,构造函数和普通函数区别仅仅在于是否使用了new来调用,它们的返回值也会不同
所谓“构造函数”,就是专门用来生成“对象”的函数。
特点:1可以生成多个对象
2可以通过.来为对象添加属性和方法
obj.name = 'Byron';
obj.printName = function(){
console.log(obj.name);
};
可以等价于
var obj = {
name: 'Byron',
printNmae: function(){
console.log(obj.name);
}
}
自动化就要使用函数嵌套了
function createObj(name, age){
var obj = {
name: name,
age: age,
printName: function(){
console.log(this.name);
}
};
return obj;
}
var obj3 = createObj('Byron', 30);
obj3.printName();
but:构造出来的对象类型都是Object,没有识别度
可以改造为
function Person(nick, age){
this.nick = nick;
this.age = age;
this.sayName = function(){
console.log(this.nick);
}
}
var p1 = new Person();
参考文章:谦行的“JavaScript面向对象”
有了如上的基础,就可以看下方的例子了。
案例:
var name="全局";
var twobin={
name:"局部",
getName:function(){
return this.name;
}
};
alert(twobin.getName());
step1:找到函数真正被调用执行的位置(运行时的位置)
既是:
alert(twobin.getName());
step2:查看有没有闭包或者直接调用再或者call与apply
没有这些内容,不会跳了出来。
step3: this: 当前方法属于谁,this就是谁!
这里指出是哪一个人twobin。那么就会默认指向window
则getName返回的this.name其实是twobin.name,因此alert出来的是“局部”!
(3)身处闭包中
var name="全局";
var twobin={
name:"局部",
getName:function(){
return function(){
return this.name;
};
}
};
alert(twobin.getName()());
step1:找到函数真正被调用执行的位置(运行时的位置)
既是:
alert(twobin.getName()());
step2:查看有没有闭包或者直接调用再或者call与apply
有,所以不能根据第一步,而是
匿名函数的运行时位置来判断。
function (){
return this.name;
};来确认位置
step3: this: 当前方法属于谁,this就是谁!
匿名函数所在的对象是window
匿名函数返回的this.name其实是window.name,因此alert出来的就是“全局”!
那么,如何在闭包中使得this身处在twobin中呢?
var name="全局";
var twobin={
name:"局部",
getName:function(){
var that=this;
return function(){
return that.name;
};
}
};
alert(twobin.getName()());
step1:找到函数真正被调用执行的位置(运行时的位置)
既是:
alert(twobin.getName());
step2:查看有没有闭包或者直接调用再或者call与apply
有,但是this不再匿名函数中
step3: this: 当前方法属于谁,this就是谁!
这里指出是哪一个人twobin。那么就会默认指向window
则getName返回的this.name其实是twobin.name,因此alert出来的是“局部”!
(4)call与apply中的this
在JavaScript中能管的住this的估计也就非call与apply莫属了。
call与apply就像this的父母一般,让this住哪它就得住哪,不得不听话!
var name="全局";
var twobin={
name:"局部",
};
function getName(){
alert(this.name);
}
getName(twobin);
getName.call(twobin);
step1:找到函数真正被调用执行的位置(运行时的位置)
既是:
getName(twobin);
step2:查看有没有闭包或者直接调用再或者call与apply
没有这些内容,不会跳了出来。
step3: this: 当前方法属于谁,this就是谁!
这里只是声明了那一类,而没有指出是哪一个人。那么就会默认指向window
则getName返回的this.name其实是window.name,因此alert出来的是“全局”!
而
getName.call(twobin);
其中,call指定this的安身之处就是在twobin对象,因为this被迫只能在twobin那安家,则此时this指向twobin对象, this.name其实是twobin.name,因此alert出来的是“局部”!
这些是我本人话了一个下午的时间总结出来的,应该有些不足。我相信在日后的工作上会慢慢的提炼出更为准确的知识。
不安分的this的更多相关文章
- 不安分的管家——Jenkins
占个位,持续补充. 一.使用Jenkins进行自动化部署 一直以来关于xx框架/中间件的技术博客有个奇怪的事情.这类文章特点大而全,重复率高,读者阅读完毕基本从安装到放弃. 作为一个使用者,我只是为了 ...
- 不安分的 Go 语言开始入侵 Web 前端领域了!( WebAssembly )
参考:https://blog.csdn.net/csdnnews/article/details/84038848 从 Go 语言诞生以来,它就开始不断侵蚀 Java .C.C++ 语言的领地.今年 ...
- 不安分的android开发者(小程序初尝试,前后台都自己做)
前言 作为一个稍微有点想法的程序员来说,拥有一个自己开发,自己运营,完全属于自己的应用,应该是很多人的梦想.刚毕业那会,自己的工作是做游戏,于是也和朋友业余时间开发一些小游戏玩玩,可是终究不成气候,而 ...
- 波哥!一个不安分的IT男
第一篇博文,紧张,窃喜,辣眼睛! 这个订阅号主要是写给自己的,近期越来越发现记忆力不如以前了! 时光如梭,岁月荏苒,或许这两句经典的开头文比较契合自己的年纪.依稀记得几年前还在组装服务器.搬机柜.做系 ...
- go 学习笔记之有意思的变量和不安分的常量
首先希望学习 Go 语言的爱好者至少拥有其他语言的编程经验,如果是完全零基础的小白用户,本教程可能并不适合阅读或尝试阅读看看,系列笔记的目标是站在其他语言的角度学习新的语言,理解 Go 语言,进而写出 ...
- 一个IT人的成长路
毕业四年多了,来深圳三年多了,经历了刚毕业的懵懂少年,成长为现在的成熟稳重青年.职场上,从刚毕业的小白,成长为现在可以成熟应对各种事情的老司机.经历过从初级研发工程师,到中级研发工程师,到高级研发工程 ...
- 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记
前言 网购已经不再是现在的时髦,而变成了我们每天的日常生活.上网已经和买买买紧密地联系在了一起,成为了我们的人生信条.而逛街一词,越来越多地变成了一种情怀.有时候我们去逛街,要么是为了打发时间,要么是 ...
- CSS知识总结(二)
CSS的选择符分成: 1. 通配选择符 2. 元素选择符 3. 群组选择符 4. 关系选择符 5. id及class选择符 6. 伪类选择符 7. 属性选择符 8. 伪对象选择符 1.通配选择符(*) ...
- GO语言之channel
前言: 初识go语言不到半年,我是一次偶然的机会认识了golang这门语言,看到他简洁的语法风格和强大的语言特性,瞬间有了学习他的兴趣.我是很看好go这样的语言的,一方面因为他有谷歌主推,另一方面他确 ...
随机推荐
- Linux 重启和关机命令
shutdown -r 05:30 在凌晨五点30分关机 shutdown -r 05:30 & 后台执行 shutdown -c 取消前一个关机命令 ...
- vijos1034题解
题目: 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲 ...
- tp框架-----Model模型层
1.Model模型层是用来做什么的呢? 主要是用来做操作数据库访问的.也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. 2.Model模型怎样使用呢? 要使用Model模型层访问数 ...
- java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式
字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...
- 容器_JDK源码分析_自己简单实现ArrayList容器
这几天仔细研究下关于ArrayList容器的jdk源码,感觉收获颇多,以前自己只知道用它,但它里面具体是怎样实现的就完全不清楚了.于是自己尝试模拟写下java的ArrayList容器,简单了实现的Ar ...
- java用户界面—创建一个面板
先从基础学起 创建一个面板 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import jav ...
- 关于SpringMVC中如何把查询数据全转成String类型
之前,本想与客户商量做几张固定的报表予使用,结果发现客户每个月都需要各种各样的报表,所以我们做了个窗口用于直接执行SQL语句:数据量一开始并不是很大查询出来的数据较少(约1-6W左右),所以刚开始几个 ...
- java加减的二进制实现
Java中整数基本类型有byte,short,int,long,大小分别为1.2.4.8个字节,一个字节大小为8位,也就是8个二进制码(0/1)组成. 计算机中二进制码分为原码,反码,补码.在计算机中 ...
- (转载)Windows 上搭建Apache FtpServer
因工作需要,最近经常接触到FTP,今天我来介绍一个开源的FTP服务器,那就是Apache FTPServer,Apache FTPServer是一个100%纯Java的FTP服务器. 它的设计是基于现 ...
- Java 学习内容总结
最近对Core Java基础做了一些学习.有自己的见解,也有别人的总结,供大家参考. 1 实现多线程的方式有几种? 其实这个问题并不难,只是在这里做一个总结.一共有三种. 实现Runnable接口,并 ...