JavaScript中关键字(this)
//测试浏览器 chrome;
- 我的错误认识;
- 我一直以为this指代的是函数本身,当时写公用方法时,就用了this这个关键字,自己也不知道为什么要用,只是看到老师在用,自己就用了。一直以来概念都很模糊,直到现在还不是很清楚,只是把自己知道的总结下来,如有错误请指出,以免误人误己。谢谢!
- 默认绑定(default binding);
- 大家在控制台输入
this
这个关键字。可以看到输出的是window
对象。 - 那是不是
this===window
?console.log(this===window)//true
; - 从上面两点大家看出什么了没?对的,
this
其实在默认的情况下创建的是全局变量;
- 大家在控制台输入
function foo(){
this.name = 'zs';
this.age = 18;
}
foo();
console.log(age)//output:18
- 隐式绑定(implicit binding);
- 从列子里可以看出
this
指代的是b
; - 结合default/implicit,可以看出
this
在函数里是代表全局变量,在Object时代表的是object;(不知道这样说对不?)
- 从列子里可以看出
var b = {
age:'20',
obj:function(){
console.log(this.age)//20
console.log(this===b)//true
console.log(this===Object)//false
}
}
b.obj()
- 显示绑定(explicit binding);
- 通过call()和apply(),来指定作用域;(可以这么说不?)
var age = 5;
function foo(){
console.log(this.age)//20
}
var b = {
age:'20'
}
foo.apply(b)
- new 绑定(new binding);
var age = 5;
function foo(age){
this.age = age;
}
console.log(new foo(20))//20
- 优先级的比较;
- explicit and implicit;
2.其它的就自己动手比较吧;
- explicit and implicit;
function foo(){
console.log(this.age);
}
var obj1 = {
age:'18',
foo:foo
}
var obj2 = {
age:'20',
foo:foo
}
obj1.foo();//18
obj2.foo();//20
obj1.foo.call(obj2);//20
obj2.foo.call(obj1);//18
//可以看出显式绑定高于隐式绑定;