【转】JavaScript里的this指针

用自然语言的角度理解JavaScript中的this关键字

<script type="text/javascript">
function ftn03(){
var ftn04 = function(){//在javascript语言里任何匿名函数都是属于window对象
console.log(this);// window , "函数里的this指向window"
};
ftn04();
}
ftn03();
/*其实在javascript语言里任何匿名函数都是属于window对象,它们也都是在全局作用域构造时候完成定义和赋值,但是匿名函数是没有名字的函数变量,但是在定义匿名函数时候它会返回自己的内存地址,如果此时有个变量接收了这个内存地址,那么匿名函数就能在程序里被使用了,因为匿名函数也是在全局执行环境构造时候定义和赋值,所以匿名函数的this指向也是window对象,所以上面代码执行时候ftn04的this也是指向window,因为javascript变量名称不管在那个作用域有效,堆区的存储的函数都是在全局执行环境时候就被固定下来了,变量的名字只是一个指代而已。*/
</script>

情形一:传入的参数是函数的别名,那么函数的this就是指向window

情形二:传入的参数是被new过的构造函数,那么this就是指向实例化的对象本身;

情形三:如果我们想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么我们就是用apply和call

我们可以通过代码看出我的结论,代码如下:

<script type="text/javascript">
var name = "I am window";
var obj = {
name:"sharpxiajun",
job:"Software",
ftn01:function(obj){
obj.show();
},
ftn02:function(ftn){
ftn();
},
ftn03:function(ftn){
ftn.call(this);//Call和apply是将this指针指向方法的第一个参数,用 ftn 对象代替 this 对象(this 继承 ftn)
}
};
function Person(name){
this.name = name;
this.show = function(){
console.log("姓名:" + this.name);
console.log(this);
}
}
var p = new Person("Person");
obj.ftn01(p);
obj.ftn02(function(){
console.log(this.name);
console.log(this);
});
obj.ftn03(function(){
console.log(this.name);
console.log(this);
});
</script>

结果如下:

【转】JavaScript里的this指针

最后再总结一下:

this都是指向实例化对象,如果在javascript语言里没有通过new(包括对象字面量定义)、call和apply改变函数的this指针,函数的this指针都是指向window

引用:<http://www.cnblogs.com/sharpxiajun/p/4148932.html>

上一篇:win7 64下暗黑世界V1.1 服务器端及客户端的安装及运行 成功


下一篇:通用mapper的使用