js中this关键字详解
来源:互联网 发布:g92的编程实例 编辑:程序博客网 时间:2024/06/02 19:42
首先,js对于this,我们有一个原则,那就是this指向的是调用该函数的对象。
下面分四种情况:
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global,也就是指向windows
请看下面这段代码,它的运行结果是1。
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
为了证明this就是全局对象,我对代码做一些改变:
var x = 1;
function test(){
alert(this.x);
}
test(); // 1
运行结果还是1。再变一下:
var x = 1;
function test(){
this.x = 0;
}
test();
alert(x); //0
情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
function test(){
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。
function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1
在这里,毕竟对象是通过这个test函数生成的,因此,this指向的也就是这个对象,this.x=o.x=1
运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:var x = 2;
function test(){
this.x = 1;
}
var o = new test();
alert(x); //2
运行结果为2,表明全局变量x的值根本没变。
情况四 apply调用
apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。
var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为
o.m.apply(o); //1
运行结果就变成了1,证明了这时this代表的是对象o
一些实例:
var name = "The Window";
var object = {
name: "My object",
getNameFunc: function() {
return this.name;
}
}
alert(object.getNameFunc()); //my object
var fun=object.getNameFunc; //the window
alert(fun());
解释:
第一个是objec.getNameFunc(),getNameFunc本来就是一个函数属性,后面有括号相当于直接调用这个方法,就是直接执行函数里面的内容,就是直接执行object的方法,因此this在这里指的是object。
第二个是fun=object.getNameFunc,那么object.getNameFunc对应的是function() { return this.name; },因此fun对应的也是这个,然后fun()相当于在全局执行fun方法,也就是在全局执行function() { return this.name; }方法,因此this指向的是全局window
更加容易理解的教程:http://mp.weixin.qq.com/s/Z_yXX9tA1KJL3ZHLPsOZ5w
- JS 中 this 关键字详解
- JS 中 this 关键字详解
- JS中this关键字详解
- js中this关键字详解
- JS/JavaScript中 this 关键字对象详解
- JS this关键字详解
- js中this关键字
- js中的this关键字详解
- js中的this关键字详解
- js中的this关键字详解
- js中的this关键字详解
- js中的this关键字详解
- js中的this关键字详解
- js中的this关键字详解
- js中this关键字探讨
- 解析JS中this关键字
- Javascript中this关键字详解
- Javascript中this关键字详解
- RTSP协议
- 1016. 部分A+B (15)
- 【云栖大会】YuMi机器人亮相阿里云栖大会
- VUE前端cookie操作
- 【Selenium】Selenium 中文技术文档
- js中this关键字详解
- centos7开机启动脚本
- Spring Cloud Netflix Eureka源码导读与原理分析
- ShimmerTextView
- Linux_Pip(Requests, Selenium, Scrapy等) 安装笔记
- How to disable DRM
- 交叉编译opencv时候ffmpeg选项始终为no的解决方法
- SIMD单指令数据流(MMX、SSE2、NEON)
- Hibernate与Mybatis对比