Javascript 中的this关键字,记住一句话就行:this指调用函数的那个对象。在一个使用方法调用语法,像 obj.myFunction()或者 obj['myFunction'](),这时this的值为obj。
话是这么说,但是刚看到这话,很难有深入理解,特别是有其他OO语言经验的同学。对于Javascript,如果知道其他OO语言的语法,对于有些概念的理解,你可能是从负数开始,比从零开始都不如~~。当然,如果你对C++、Java或C#有深入理解,那么还是会发现很多共同之处的。
加入了面向对象的概念后,代码从面向过程的一个个的函数调用,变成了针对对象进行操作。我们可以向下面这样写代码
public class A
{
private int i;
public void methodA()
{}
public void methodB(int a)
{
this.i =a;
}
}
...
A a = new A();
a.methodA();
a.methodB();
实际上,对于methodA和methodB,编译后,可以认为它们长成这样
void methodA(A this){}
void methodB(A this,int a){this.i = a}
this不是平白就有得,是编译器给我们添加的。
需要说明一下:this本身不能变化,this指向的对象可以改变,不同语言表示this本身不能变得语法不一样,所以这里没写。
对于Java或C#这类语言,methodA的第一个参数只能是A对象或其子类。
Javascript是弱对象语言,没法对函数参数的类型进行提前检测。
比如:
function log()
{
console.log(this.name);
}
相当于
function log( this)//不带类型限制
{
console.log(this.name);
}
所以,
var a={name:"a"};
a.aLog = log;
a.aLog();
相当于aLog(a),于是this被赋值成a,自然回去找a["name"],找到,输出a
如果直接调用log();在浏览器环境下,相当于log(window);window中,我们还没定义name属性,所以输出undefined
另外多讲一个例子:
function Person()
{
this.name = "jzl";
this.age = 25;
this.info = function{
console.log(this.name+":"+this.age);
}
}
var p = new Person();
最后一句话,相当于
var p = {};
Person(p);
把p当作this,传进Person函数,函数执行完后,p有拥有了name,age,info属性。