JavaScript中的this浅谈
对大多数JavaScript的初学者来说,this的取值一直困扰着大家,我曾经为了学习this也看了不少这方面的介绍。现在把我对this的理解写出来,分享给大家,如果我这篇随笔有幸帮到了大家,我会感到非常高兴。好了,废话少说,来点实在的。
一句话,函数中的this始终指向调用该函数的对象。
这就像一个公式,下面我们套用一下公式看看是不是这样。
1 var name = 'hello world'; 2 function test(){ 3 alert(this.name); 4 alert(this === window); 5 } 6 test();//等效于window.test(),输出结果是'hello world',true
上面的代码中test()是一个全局函数,默认的属于window对象,所以相当于window对象调用的该函数,this的值等于window,符合那个公式。
下面这块代码展示了对象中this的指向
1 var name = 'foo'; 2 var age = 20; 3 var person = { 4 name: 'hello world', 5 age: 22, 6 sayHello:function(){ 7 alert('I\'m ' + this.name + ', and I\'m ' + this.age + ' years old'); 8 } 9 }; 10 person.sayHello();//I'm hello world, and I'm 22 years old
上面的代码中调用sayHello()函数的对象是person,按照公式this的值应该是person,而事实也正是如此。
下面的代码展示了另一种声明对象的方式中this的取值
1 var name = 'foo'; 2 var age = 20; 3 var Person = function(_name, _age){ 4 this.name = _name; 5 this.age = _age; 6 this.sayHello = function(){ 7 alert('I\'m ' + this.name + ', and I\'m ' + this.age + ' years old'); 8 } 9 }; 10 var p1 = new Person('Hello World', 22); 11 var p2 = new Person('ScriptJava', 20); 12 p1.sayHello();//I'm Hello World, and I'm 22 years old,this指向p1 13 p2.sayHello();//I'm ScriptJava, and I'm 20 years old,this指向p2
如果要修改JavaScript中this的指向,可以用call()和apply()方法。这两个的方法功能相同,用法类似,先看下面的代码。注:以下的代码摘自Professional JavaScript for Web Developers
1 window.color = "red"; 2 var o = { color: "blue"}; 3 4 function sayColor(){ 5 alert(this.color); 6 } 7 8 sayColor(); //"red" 9 o.sayColor = sayColor; 10 o.sayColor(); //"blue"
第10行的结果表明this的值变成了对象o,下面的代码可以实现同样的效果。
window.color = "red"; var o = {color: "blue"}; function sayColor(){ alert(this.color); } sayColor.apply(o);//"blue" sayColor.call(o);//"blue"
可以发现,sayColor当中的this已经变成了o,call()和apply()方法的区别在于接收参数的方式不同,如下面的代码所示
1 function sum(x, y){ 2 var sum = x + y; 3 alert(sum); 4 } 5 sum.apply(this, [1, 2]); //3 6 sum.call(this, 1, 2); //3
这里的this指向window对象。从上面的代码中你应当能看出apply()和call()的区别了。
博客刚开通不久,写作水平有限,不妥之处欢迎和大家交流。(完)^_^