关于jS闭包里面的this

xieqing8481 2014-03-05 01:16:52
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没弄明白!
...全文
245 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieqing8481 2014-03-05
  • 打赏
  • 举报
回复
引用 6 楼 wzs_xyz 的回复:
闭包保护变量即可,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了 } }
再也不函数嵌套又用重复的变量名了,这个大意是这function要放对象里才能体会用处的吧!
xieqing8481 2014-03-05
  • 打赏
  • 举报
回复
引用 5 楼 l676331991 的回复:
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).
恩,解释的好清楚,看来我要试试把他们放对象里了!
xieqing8481 2014-03-05
  • 打赏
  • 举报
回复
引用 4 楼 Return_false 的回复:
1.应该了解下作用域的概念,父级作用域的变量可以被子集作用域直接访问,如果子集作用域中没有找到变量,那么会顺着作用域链逐层上爬,直到找到为止。如果清楚了这个概念,我想你可以修改变量名称,或者将同名的变量值作为参数传递给子函数 2.this 指向当前调用函数的对象 直接调用 就是window 事件调用 则是触发事件的当前页面元素 比如 a.onclick=function(){//this};
哦,我再想想,还以为this能指父函数,函数是对象吗?刚看网上把父函数说成构造函数。
天际的海浪 2014-03-05
  • 打赏
  • 举报
回复
函数闭包和this没有直接的关系 只有对类用new创建实例对象时this才有意义, 不用new的话,this就只是等于windows对象
zhjdg 2014-03-05
  • 打赏
  • 举报
回复
你还真的把他当作私有属性来用。 那是模拟,
未知数 2014-03-05
  • 打赏
  • 举报
回复
闭包保护变量即可,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了 } }
l676331991 2014-03-05
  • 打赏
  • 举报
回复
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).
  • 打赏
  • 举报
回复
1.应该了解下作用域的概念,父级作用域的变量可以被子集作用域直接访问,如果子集作用域中没有找到变量,那么会顺着作用域链逐层上爬,直到找到为止。如果清楚了这个概念,我想你可以修改变量名称,或者将同名的变量值作为参数传递给子函数 2.this 指向当前调用函数的对象 直接调用 就是window 事件调用 则是触发事件的当前页面元素 比如 a.onclick=function(){//this};
zhjdg 2014-03-05
  • 打赏
  • 举报
回复
乱七八糟的, 那来的this.name。
xieqing8481 2014-03-05
  • 打赏
  • 举报
回复
引用 楼主 u013756841 的回复:
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没弄明白!
感觉不是我想要的啊,这是投机吧!2个问题 1.一个函数怎么同时取到自己的变量和包含它的函数的同名变量 2.this就一定是windows对象吗?
嘻哈大咖秀 2014-03-05
  • 打赏
  • 举报
回复
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()()());

87,921

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧