var name="wangjun";
var ad={
name:"adang",
init:function( ){
alert(this==window); // false
alert(this==ad); // true
var a=function( ){
alert(this==window); // true
}
a( );
}
}
ad.init( );
</script>
第三个返回true,是在函数里头再定义函数。这个时候this的上下文会发生变化,不再是ad,而是window。
因为var a=function( ) { alert(this==window);}相当于function a( ) { alert(this==window); },后者更像一个函数,而这个函数的调用是a( )也即window.a(),它并没有靠ad.init.a()来调用,所以它里头的this也不指向ad或者ad.init,而是window,因为a()也即window.a()。
=======================================================================================
<script type="text/javascript">
var name="wangjun";
function a( ){
alert(this.name);
}
var ad={
name:"adang",
go:function( ){
a( ); 改成a.call(ad);则结果是连续弹出两个“adang”
alert(this.name)
}
}
ad.go( );
</script>
结果是先弹出“wangjun”,后弹出“adang”
还是那个原理,ad对象里的go函数是ad来调用的,所以alert(this.name)的this指向ad,而go函数里的a函数并没有靠ad.go.a()的方式来调用,而是通过调用go函数间接调用a()函数,所以a()相当于window.a()所以这里的this指向window。