我想把第四行的link[i] 替换成this指代结果发现不行?
this不是指代这个i吗?
为什么第五行的 showPic(this) 可以使用?
是不是因为作用域的问题?
var gallery = document.getElementById("imagegallery");
var links = gallery.getElementsByTagName("a"); //a元素的集合
for ( var i=0; i < links.length; i++) { //a元素遍历
links[i].onclick = function() { //我想把本行的link[i] 替换成this指代结果发现不行?
return showPic(this);
}
links[i].onkeypress = links[i].onclick;
}
for语句不具有作用域限制
那个匿名函数里的this
能用,是因为这个匿名函数是绑定在links[i]
上的方法。
外面的this
跟links[i]
一毛钱关系没有。
for并不是一个函数,
在一个函数里的this是指谁调用这个函数,那么这个this就是指的谁,全局作用域里的this指的是window
这里用this.onclick,this指代的是全局windiw下挂载一个函数onclick。
与作用域无关。
函数中的this指向调用函数的对象,即为函数所附属的对象。
如果楼主贴的代码没有方法体包裹,第四行的this指向全局对象,在浏览器环境下就是window对象。
第五行所在的方法是links[i]这个节点对象的方法,因此this是links[i]。
js的函数根据运行环境会产生不同的执行上下文(函数内部this的指向不同),而call & apply 函数可以改变运行环境。可以试着理解这几个相关的概念。
this的作用域指向的是调用当前方法的对象,第四行如果换成this的话指向的是全局作用域,调用show()时指向的是调用show方法的对象,基础太差了,好好补补基础吧
同学,为何会觉得用this
可以替换这个link[i]
?这里的 this
是什么?输出来看过了没?
兄弟!是不是用JQuery用惯了:
$('a').each(function() {
$(this).dosomething();
});
额 你还是好好看看《Javascript权威指南》吧!
<script>
// 如果你的上述的代码在这里
// 这里this === window
function ABC() {
}
ABC.prototype.foo = function() {
console.log(this);
};
var s = new ABC();
s.foo(); // 这时候foo函数里面的this指向s
var obj = {
abc: 23,
name: 'dfdf'
};
s.foo.call(obj) // 这里foo函数里面的this指向obj
</script>
想讲明白,不容易,关键靠悟。
请看这里 MDN
大元旦的都还在回答问题,大家都辛苦了,一人给个赞!
this是指调用某个函数的那个对象,建议你看看书打好基础。