this指向

1.全局指向global --window -- BOM --browser object model

	 		var num = 10;
			function foo(){
				this.num = 1;
			}
			foo();
			alert(num);
	 	

当不调用函数foo()时,弹出10.

调用函数foo()后,因为函数直接在全局中调用,this指向全局window.结果弹出1

2.this指向对象

	 		var num = 3;//window 下num是3
			var obj = {};
			obj.num = 5;
			obj.f = function(){
				alert(this.num);//this for object{num:5}
			}
			obj.f();
			alert("全局num"+num);
	 	

运行结果:先弹出5.因为this指向object{num:5}

再弹出:全局num3.this指向window

3.函数返回指向

	 		var num = 2;
			function foo() {
				return function fun() {
					return this.num;
				}
			}
			var f = foo();
			console.log(f());
	 	

运行结果:2。函数返回后指向全局window

4.apply()改变函数内部this指向的对象

	 		var o = {num:100}
			var num = 10;
			var obj = {};
			obj.num = 1;
			obj.f = function(){
				alert(this.num)
			}
			obj.f();//this for obj
			//如果第一个参数为空,函数内部this指向window
			obj.f.apply();//this for window
			obj.f.apply(obj)//this for obj
			obj.f.apply(o)//this for o
	 	

运行结果:先后弹出10 1 100

5.示例问题一

	 		//Q1:this for what
           var say = "hello world";
           var obj = {};
           obj.say = "hello object";
           obj.foo = function(){
           	return function(){
           		return this.say;
           	}
           }
           alert(obj.foo()());//返回函数在window运行
           
	 	

运行结果:弹出hello world。相当于:

	 	   var f = obj.foo();
           alert(f());
	 	

6.示例问题二

	    	var say = "hello world";
           var obj = {};
           obj.say = "hello object";
           obj.foo = function(){
           	var that = this;
           	return function(){
           		return that.say;
           	}
           }
           var f = obj.foo();
           alert(obj.foo()());
	    

运行结果:hello object