js this的指向详解
2016-05-21 14:42
891 查看
js 的this指向主要有四种:
1.作为对象的方法调用,这个时候this指向的事该对象
例如: var obj={
a:1,
getA:function(){
alert(this===obj);//true
alert(this.a);//1
}
}
2.作为普通函数调用,这个时候this总是指向全局对象(在浏览器中既window对象)
window.name='zhangshan';
var getName=function(){
console.log(this.name);//zhangshan
}
3.作为构造器调用,这个时候this的指向就分情况了,主要是看构造器有没有显式返回一个对象。
当用new 运算符调用函数时,该函数总会返回一个对象,通常情况this就是指向这个对象的
但是如果构造器显式的返回一个object类的对象,那么运算结果最终返回的事那个对象而不是this,所以这个时候this指向的对象就是显式返回的那个对象
4.Function.prototype.call或者Function.prototype.apply可以动态改变this
两者的功能完全一样,只是参数不同
call第一个参数是this要指向的上下文,后面跟着的参数不固定,都是当成函数的参数传递进去
apply第一个参数也是this要指向的上下文,后面是一个数组或者类数组,数组的每一项按照顺序当成是函数的参数传递进去,也可以这样理解这个数组就是函数的arguments
var obj1 = {
name: '111';
}
var obj2 = {
name: '222';
}
window.name = 'window';
var getName= function(a,b) {
alert(this.name);
alert(a);
alert(b);
}
getName();//window,undefined,undefined;
getName.call(obj1,'a','b');//111,a,b
getName.apply(obj2,'a','b');//222,a,b
就这麽简单:
1.总结来讲,call和apply都是为了改变某个函数运行时的上下文,换句话说就是改变函数内部this的指向,js的函数上下文
可以分为定义时上下文,运行时上下文。而且上下文是可以改变的。
2.为什么要改变向上下文呢????????? 主要是为了实现一种情况,当一个对象没有某个方法
的时候,而且另外一个对象却有这个方法,这个时候就可以通过改变上下文来使用自己没有的方法了。
比如:obj1没有showName()方法,obj2有,这个时候可以这个样子使用,var temp=obj1.prototype.call(obj2);这样就可以用obj2的方法了
3.那什么时候用call什么时候用apply????????
当参数个数是固定不变的时候可以用call,当参数个数不确定可以用apply,把要传递的参数push到一个数组里面然后传递给函数
1.作为对象的方法调用,这个时候this指向的事该对象
例如: var obj={
a:1,
getA:function(){
alert(this===obj);//true
alert(this.a);//1
}
}
2.作为普通函数调用,这个时候this总是指向全局对象(在浏览器中既window对象)
window.name='zhangshan';
var getName=function(){
console.log(this.name);//zhangshan
}
3.作为构造器调用,这个时候this的指向就分情况了,主要是看构造器有没有显式返回一个对象。
当用new 运算符调用函数时,该函数总会返回一个对象,通常情况this就是指向这个对象的
但是如果构造器显式的返回一个object类的对象,那么运算结果最终返回的事那个对象而不是this,所以这个时候this指向的对象就是显式返回的那个对象
var MyClass1 = function() { this.name = '111'; } var obj1 = new MyClass1(); alert(obj1.name); //111 var MyClass2 = function() { this.name = '111'; return { //显式的返回一个对象 name: '222'; } } var obj2 = new MyClass2(); alert(obj2.name); //222
4.Function.prototype.call或者Function.prototype.apply可以动态改变this
两者的功能完全一样,只是参数不同
call第一个参数是this要指向的上下文,后面跟着的参数不固定,都是当成函数的参数传递进去
apply第一个参数也是this要指向的上下文,后面是一个数组或者类数组,数组的每一项按照顺序当成是函数的参数传递进去,也可以这样理解这个数组就是函数的arguments
var obj1 = {
name: '111';
}
var obj2 = {
name: '222';
}
window.name = 'window';
var getName= function(a,b) {
alert(this.name);
alert(a);
alert(b);
}
getName();//window,undefined,undefined;
getName.call(obj1,'a','b');//111,a,b
getName.apply(obj2,'a','b');//222,a,b
就这麽简单:
1.总结来讲,call和apply都是为了改变某个函数运行时的上下文,换句话说就是改变函数内部this的指向,js的函数上下文
可以分为定义时上下文,运行时上下文。而且上下文是可以改变的。
2.为什么要改变向上下文呢????????? 主要是为了实现一种情况,当一个对象没有某个方法
的时候,而且另外一个对象却有这个方法,这个时候就可以通过改变上下文来使用自己没有的方法了。
比如:obj1没有showName()方法,obj2有,这个时候可以这个样子使用,var temp=obj1.prototype.call(obj2);这样就可以用obj2的方法了
3.那什么时候用call什么时候用apply????????
当参数个数是固定不变的时候可以用call,当参数个数不确定可以用apply,把要传递的参数push到一个数组里面然后传递给函数
相关文章推荐
- Extjs4.0 最新最全视频教程
- Javascript中toFixed方法的改进
- 5个常见可用性错误和解决方案
- js数组实现图片轮播
- js可突破windows弹退效果代码
- JSP脚本漏洞面面观
- 使用BAT一句话命令实现快速合并JS、CSS
- js显示当前星期的起止日期的脚本
- 爆炸式的JS圆形浮动菜单特效代码
- js select常用操作控制代码
- JS实现不使用图片仿Windows右键菜单效果代码
- 从jsp发送动态图像
- 原生js结合html5制作小飞龙的简易跳球
- js 页面模块自由拖动实例
- js实现小鱼吐泡泡在页面游动特效
- js 提交和设置表单的值
- PHP VBS JS 函数 对照表
- node.js抓取并分析网页内容有无特殊内容的js文件
- PHP+JS实现大规模数据提交的方法
- 仿51JOB的地区选择效果(可选择多个地区)