var num = 10; function foo(){ this.num = 1; } foo(); alert(num);
当不调用函数foo()时,弹出10.
调用函数foo()后,因为函数直接在全局中调用,this指向全局window.结果弹出1
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
var num = 2; function foo() { return function fun() { return this.num; } } var f = foo(); console.log(f());
运行结果:2。函数返回后指向全局window
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
//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());
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