日期:2014-05-16  浏览次数:20403 次

关于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对象