解析JS中this关键字
2016-05-10 21:23
274 查看
this是javascript语言的一个关键字。它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。
记住:this 永远指向其所在函数的所有者,如果没有所有者,指向window。意思就是this所在函数被谁调用的,就指向谁。
1)全局函数中的this指向
默认绑定全局变量,当函数被单独定义和调用的时候,应用的规则就是绑定全局变量。
在JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性“。
function test(){
alert(this);
}
test()这个函数没有所有者,是一个全局函数,属于window对象,因此此时this指向的是window
2)对象方法中的this指向
隐式调用,函数调用时拥有一个上下文对象,就好像这个函数是属于该对象的一样。
obj.test =function(){
alert(this==obj); //true
}
obj.test表示的是test这个函数的所有者是对象obj,函数是作为对象obj的方法调用的,因此this应当是指向obj对象
3)绑定函数时的this
如下代码,test1和test2中this并不相同:
var test2 = o.test1;
test2();
o.test1 =function(){
alert(this===o);
}
test2这个函数并没有所有者。test2虽然调用了test1这个函数,但是this仍然指向window,而不是指向test1的拥有者:对象o
这便是上面所说的,要将函数与函数名分开看待
此时如果我们对3)中的代码进行一些修改:
function test (){
alert(this=== o);
}
test();//this指向window
var o ={};
o.test2 = test;
o.test2();//此时test2的所有者为o,而test没有所有者,this在此时指向的是o
alert(o.test2);
4)鼠标单击事件等进行函数的绑定时,this的指向
document.onclick=function(){
alert(this===document); //输出为true,
}
onclick事件的拥有者是document。因此,此处this指向document。
5)构造函数中的this
通过构造函数可以生成一个新对象,this就指向这个新对象。
function test(){
this.x = 1;
}
var object = new test();
alert(object.x); // 1
6)改变this指向—apply()、call()
可以通过apply()\call() 改变函数的调用对象,切换函数执行的上下文环境(context),即 this 绑定的对象
apply的用法和call的用法大致相同,区别在于第二个参数:
apply只接受两个参数,第一个参数和call相同(指定该函数将被哪个对象所调用),第二个参数必须是一个数组;
call则作为call的参数传入。
如: func.call(thisobj,var1,var2,var3);
func.apply(thisobj,[var1,var2,var3]);
记住:this 永远指向其所在函数的所有者,如果没有所有者,指向window。意思就是this所在函数被谁调用的,就指向谁。
1)全局函数中的this指向
默认绑定全局变量,当函数被单独定义和调用的时候,应用的规则就是绑定全局变量。
在JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性“。
function test(){
alert(this);
}
test()这个函数没有所有者,是一个全局函数,属于window对象,因此此时this指向的是window
2)对象方法中的this指向
隐式调用,函数调用时拥有一个上下文对象,就好像这个函数是属于该对象的一样。
obj.test =function(){
alert(this==obj); //true
}
obj.test表示的是test这个函数的所有者是对象obj,函数是作为对象obj的方法调用的,因此this应当是指向obj对象
3)绑定函数时的this
如下代码,test1和test2中this并不相同:
var test2 = o.test1;
test2();
o.test1 =function(){
alert(this===o);
}
test2这个函数并没有所有者。test2虽然调用了test1这个函数,但是this仍然指向window,而不是指向test1的拥有者:对象o
这便是上面所说的,要将函数与函数名分开看待
此时如果我们对3)中的代码进行一些修改:
function test (){
alert(this=== o);
}
test();//this指向window
var o ={};
o.test2 = test;
o.test2();//此时test2的所有者为o,而test没有所有者,this在此时指向的是o
alert(o.test2);
4)鼠标单击事件等进行函数的绑定时,this的指向
document.onclick=function(){
alert(this===document); //输出为true,
}
onclick事件的拥有者是document。因此,此处this指向document。
5)构造函数中的this
通过构造函数可以生成一个新对象,this就指向这个新对象。
function test(){
this.x = 1;
}
var object = new test();
alert(object.x); // 1
6)改变this指向—apply()、call()
可以通过apply()\call() 改变函数的调用对象,切换函数执行的上下文环境(context),即 this 绑定的对象
apply的用法和call的用法大致相同,区别在于第二个参数:
apply只接受两个参数,第一个参数和call相同(指定该函数将被哪个对象所调用),第二个参数必须是一个数组;
call则作为call的参数传入。
如: func.call(thisobj,var1,var2,var3);
func.apply(thisobj,[var1,var2,var3]);
相关文章推荐
- 说说JSON和JSONP,也许你会豁然开朗
- js实现继承的6种方式 寄生继承没弄懂
- 韩顺平细说jsp购物车项目--用户登录及验证
- 使用JavaScript实现ajax
- 全端Web开发 使用JavaScript与Java 阅读笔记
- 三种js数组去重的方法
- bzoj 1452: [JSOI2009]Count
- jsp与FCKeditor配置使用说明
- cojs 简单的数位DP 题解报告
- 【JAVAScript】js为日期框设置默认时间
- JavaScript的计时器的工作原理(setTimeout/setInterval)
- 记录js错误:Uncaught SyntaxError: Unexpected token <
- Realm-json遇到的问题
- 由于BOM头导致的Json解析出错
- 怎么遍历jsonarray
- jsp页面中截取字符串
- JSTL标签(可以直接在jsp页面格式化)
- iframe.js
- jsp如何往js里传值
- [Effective JavaScript 笔记] 第6条:了解分号插入的局限