js this机制的四种规则
2017-03-06 11:43
344 查看
this机制的四种规则
this到底绑定或者引用的是哪个对象环境决定于函数被调用的地方。而函数的调用有不同的方式,在不同的方式中调用决定this引用的是哪个对象是由四种规则确定的。我们一个个来看。
默认绑定全局变量
这条规则是最常见的,也是默认的。当函数被单独定义和调用的时候,应用的规则就是绑定全局变量。如下:
JavaScript
隐式绑定隐式调用的意思是,函数调用时拥有一个上下文对象,就好像这个函数是属于该对象的一样。例如:JavaScript
需要说明的一点是,最后一个调用该函数的对象是传到函数的上下文对象(绕懵了)。如:
JavaScript
还有一点要说明的是,失去隐式绑定的情况,如下:JavaScript
如上,第8行虽然有隐式绑定,但是它执行的效果明显是把fn赋给bar。这样bar执行的时候,依然是默认绑定全局变量,所以输出结果如上。
显示绑定
学过bind()\apply()\call()函数的都应该知道,它接收的第一个参数即是上下文对象并将其赋给this。看下面的例子:
JavaScript
如果我们传递第一个值为简单值,那么后台会自动转换为对应的封装对象。如果传递为null,那么结果就是在绑定默认全局变量,如:JavaScript
new新对象绑定
如果是一个构造函数,那么用new来调用,那么绑定的将是新创建的对象。如:
JavaScript
注意,一般构造函数名首字母大写,这里没有大写的原因是想提醒读者,构造函数也是一般的函数而已。
this到底绑定或者引用的是哪个对象环境决定于函数被调用的地方。而函数的调用有不同的方式,在不同的方式中调用决定this引用的是哪个对象是由四种规则确定的。我们一个个来看。
默认绑定全局变量
这条规则是最常见的,也是默认的。当函数被单独定义和调用的时候,应用的规则就是绑定全局变量。如下:
JavaScript
12345 | function fn() { console.log( this.a );}var a = 2;fn(); // 2 -- fn单独调用,this引用window |
1 2 3 4 5 6 7 8 | functionfn(){ console.log(this.a); } varobj={ a:2, fn:fn }; obj.fn();// 2 -- this引用obj。 |
JavaScript
123456789101112 | function fn() { console.log( this.a );}var obj2 = { a: 42, fn: fn};var obj1 = { a: 2, obj2: obj2};obj1.obj2.fn(); // 42 -- this引用的是obj2. |
1 2 3 4 5 6 7 8 9 10 | functionfn(){ console.log(this.a); } varobj={ a:2, fn:fn }; varbar=obj.fn;// 函数引用传递 vara="全局";// 定义全局变量 bar();// "全局" |
显示绑定
学过bind()\apply()\call()函数的都应该知道,它接收的第一个参数即是上下文对象并将其赋给this。看下面的例子:
JavaScript
1234567 | function fn() { console.log( this.a );}var obj = { a: 2};fn.call( obj ); // 2 |
1 2 3 4 5 6 7 8 | functionfn(){ console.log(this.a); } varobj={ a:2 }; vara=10; fn.call(null);// 10 |
new新对象绑定
如果是一个构造函数,那么用new来调用,那么绑定的将是新创建的对象。如:
JavaScript
1 2 3 4 5 | functionfn(a){ this.a=a; } varbar=newfn(2); console.log(bar.a);// 2 |
相关文章推荐
- javascript this机制的四种使用规则
- this 机制的四种规则
- Discuz-x系列教程 DX的css命名规则、缓存、加载机制
- 如何才能系统的学习 iOS 开发,理解一些规则和深层次的机制原理
- java gc的调用机制 和编程规则
- Ribbon 负载均衡机制(自定义负载均衡规则)
- webform中四种状态机制 application,session,cookie,viewstate
- Mail,邮件服务(三):POP3认证机制,以及中继的规则
- 反射机制获取对象的四种方法
- 如何才能系统的学习 iOS 开发,理解一些规则和深层次的机制原理?
- 密码规则:25年来骇客总在用四种方法破解密码
- UML中的规则和公共机制
- Qt槽机制及简单规则
- [转]Discuz-x系列教程: DX的css命名规则、缓存、加载机制 BY:cr180
- C#创建不规则窗体四种方式 01
- Oracle8i基于规则的优化机制对表达式的处理
- 关键词拍卖竞价机制,排序与计费规则
- REST API的认证机制的设计规则
- 《Drools 7 规则引擎教程》番外篇-规则条件匹配机制