JS中this引用问题 本帖最后由 lw5853103 于 2012-09-01 18:50:04 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码都不全 有部分变量都不知道是什么... 看样是还是闭包的原因 有两种方案 貌似下面的那种 立即执行一函数 改变this的作用域的方式 是一种还有一种就是 通过给对象添加需要的参数 然后再 函数里面使用这个参数 相当于是给 当前对象绑定 你所需要的参数 之类 看不明白。顺便菜鸟的问一下oLables[i].onmouseover = function(self){ //因为我想调用外部定义的startAction函数,所以不得不使用闭包 self.startAction(oLis[this.index] , {"opacity":100}); // 这里出现了问题!这里的this指向的不是 oLables[i],所以this.index实际上undefined,我打印了this输出结果是:window... }(this);最后面的(this)有啥作用? NavBar.prototype.init = function(){var _startAction ==this.startAction; for(var i = 0 ; i < this.showLength; i++) { oLi[i].index = i; oLables[i].onmouseover = function(self){ _startAction(oLis[this.index] , {"opacity":100}); }; }} 似乎用了插入代码就不能改变色彩了啊...用一个局部变量保存外层函数的this指向就可以了NavBar.prototype.init = function(){var _this=this; for(var i = 0 ; i < this.showLength; i++) { oLi[i].index = i; oLables[i].onmouseover = function(){ _this.startAction(oLis[this.index] , {"opacity":100}); } }} function xxx(self){...}(this)这种写法表示定义函数后立即执行,后面的括号里面自然是参数,this对应self参数 也就是说,参数self=后面的this??这个东东写和不写,区别在哪里?我做了个小例子去帮助自己理解,i=0时无错,但后面就报错:尚未实现 oLables[i].onmouseover = function(self){ //因为我想调用外部定义的startAction函数,所以不得不使用闭包 self.startAction(oLis[this.index] , {"opacity":100}); // 这里出现了问题!这里的this指向的不是 oLables[i],所以this.index实际上undefined,我打印了this输出结果是:window... }(this);应该是:oLables[i].onmouseover = (function(self){ self.startAction(oLis[this.index] , {"opacity":100}); })(this);//this值传给self供闭包函数内用。不过我建议传i进去更好。oLables[i].onmouseover = (function(n){ oLables[n].startAction(oLis[n] , {"opacity":100}); })(i); 当然有区别,函数内的this总是指向调用函数的对象,也就是说他xxx.onmouseover=function(){}后,该函数成为xxx对象的方法,作为方法被调用时函数内部this指向xxx,而不是外层的this指向了,所以他想将外层函数的this作为参数传进函数调用但这儿他这么写是错误的,定义函数后立即执行,xxx.onmouseover=function(){}()得到的实际是该函数的返回值才对,函数没有返回值,所以他的oLables[i].onmouseover得到的值应该是undefind 呃,明白了。谢谢指教那他这么用貌似也没什么必要,多绕呀,直接外面再定义一个变量,像你说的 var _this=this;就可以使用外部的this了,与oLables[i].onmouseover中的this又不冲突 我估计这应该是你马上调用函数的原因,这种匿名函数,在未赋予给特定对象时,应该会被当成是一个全局函数,这时它的this就会指向window这个全局对象了 问个内存泄露的小问题 eval获取对象,firefox的对应写法 帐号以二个字符开头,的SCRIPT 语句如何写呀 window.open打开窗口的问题 弹出窗口问题--紧急。 有一个动态生成的表,如何判断它尚未被生成? javascript 防止页面刷新 ActiveXObject 啊。。写了一天了。。ASP和DHTML结合的远程调用的简化,仿WebService做的。 这个js是什么加密的呀,头大 js判断过后保留控件内容 感觉有点困难的JS实现问题
看样是还是闭包的原因 有两种方案 貌似下面的那种 立即执行一函数 改变this的作用域的方式 是一种还有一种就是 通过给对象添加需要的参数 然后再 函数里面使用这个参数 相当于是给 当前对象绑定 你所需要的参数 之类
//因为我想调用外部定义的startAction函数,所以不得不使用闭包
self.startAction(oLis[this.index] , {"opacity":100});
// 这里出现了问题!这里的this指向的不是 oLables[i],所以this.index实际上undefined,我打印了this输出结果是:window...
}(this);
最后面的(this)有啥作用?
NavBar.prototype.init = function(){
var _startAction ==this.startAction;
for(var i = 0 ; i < this.showLength; i++)
{
oLi[i].index = i;
oLables[i].onmouseover = function(self){
_startAction(oLis[this.index] , {"opacity":100});
};
}
}
用一个局部变量保存外层函数的this指向就可以了
NavBar.prototype.init = function(){
var _this=this;
for(var i = 0 ; i < this.showLength; i++)
{
oLi[i].index = i;
oLables[i].onmouseover = function(){
_this.startAction(oLis[this.index] , {"opacity":100});
}
}
}
这种写法表示定义函数后立即执行,后面的括号里面自然是参数,this对应self参数
这个东东写和不写,区别在哪里?
我做了个小例子去帮助自己理解,i=0时无错,但后面就报错:尚未实现
//因为我想调用外部定义的startAction函数,所以不得不使用闭包
self.startAction(oLis[this.index] , {"opacity":100});
// 这里出现了问题!这里的this指向的不是 oLables[i],所以this.index实际上undefined,我打印了this输出结果是:window...
}(this);
应该是:oLables[i].onmouseover = (function(self){
self.startAction(oLis[this.index] , {"opacity":100});
})(this);
//this值传给self供闭包函数内用。不过我建议传i进去更好。oLables[i].onmouseover = (function(n){
oLables[n].startAction(oLis[n] , {"opacity":100});
})(i);
所以他想将外层函数的this作为参数传进函数调用
但这儿他这么写是错误的,定义函数后立即执行,xxx.onmouseover=function(){}()得到的实际是该函数的返回值才对,函数没有返回值,所以他的oLables[i].onmouseover得到的值应该是undefind