关于jS闭包里面的this
var name="The Windows";
function object(){
var name="My Object";
var getNameFunc=function(){
var name="My GetNameFunc";
alert("name2:"+name+" this.name2:"+this.name);
return function(){
var name="My NONameFunc";
alert("name3:"+name+" this.name3:"+this.name);
return this.name;
};
}
alert("name1:"+name+" this.name1:"+this.name);
return getNameFunc;
}
alert(object()()());
我想在“this.name2:”这个弹出框上显示"My Object",“this.name3:”这个弹出框上显示"My GetNameFunc,表达式该怎么写?函数外面的函数不是对象吗?这个this没弄明白!
------解决方案--------------------var name="The Windows";
function object(){
this.name="My Object";
this.getNameFunc=function(){
var name="My GetNameFunc";
alert("name2:"+name+" this.name2:"+this.name);
return function(){
this.name="My NONameFunc";
alert("name3:"+this.name+" this.name3:"+this.name);
return this.name;
};
}
alert("name1:"+name+" this.name1:"+this.name);
return getNameFunc;
}
alert(object()()());
------解决方案--------------------1. 一个函数中的变量如果和上一层函数(即上一个作用域)存在同名,那么上一层函数的变量将会被本函数中的这个变量所隐藏(即不可见),js查找变量的机制决定了这一切。
2.this不一定是window对象,看看这个例子你就明白了:
var testFn = function(){alert(this.name);}
var name = 'aaa';
testFn(); //aaa,这里调用了window.name
var obj = {name:'bbb'};
obj.testFn = testFn;
obj.testFn(); //bbb obj.name
testFn.call({name:'ccc'}); //ccc
var obj2 = {};
obj2.fn = function(){alert(this.age);}
obj2.age = 18;
var fn = obj2.fn;
fn(); //undefined, 函数被赋值给一个变量,然后脱离任何对象运行,this为window
函数中的this指代谁,是由函数调用时决定的,函数附着在哪个对象上运行,那么this就指代它,通过call和apply方法,可以指定this对象。如果函数没有依托任何对象运行,则this为window(js的严格模式下,this为null).
------解决方案--------------------闭包保护变量即可,this可以这样处理;
至于函数嵌套又用重复的变量名,这是你自己的问题,没人逼你,不要用同样的变量名不就没事了
如:
function(){
var name=xx;
var _name = name;//给变量一个别名不就可以了,非得较劲用同样变量名作甚?
var _this = this;//this可按同样原理处理
return function(){
var name=xxx;
var alert(_name);//name被覆盖,使用别名不就行了?
alert(_this)://这儿用_this即可引用到外部函数的this了
}
}
------解决方案--------------------函数闭包和this没有直接的关系
只有对类用new创建实例对象时this才有意义,
不用new的话,this就只是等于windows对象