Javascript 在本例中,为什么我的匿名函数没有当前对象的上下文?
当我在Google Chrome中运行此示例代码时,预期的行为——在当前页面的占位符图像标记中加载图像——不会发生。调用showPic()时,我检查了currPic的值,它是“未定义的”。我知道如果我将showPic的参数从“锚[I]”更改为“this”,那么它就会工作,但我试图理解为什么会这样Javascript 在本例中,为什么我的匿名函数没有当前对象的上下文?,javascript,Javascript,当我在Google Chrome中运行此示例代码时,预期的行为——在当前页面的占位符图像标记中加载图像——不会发生。调用showPic()时,我检查了currPic的值,它是“未定义的”。我知道如果我将showPic的参数从“锚[I]”更改为“this”,那么它就会工作,但我试图理解为什么会这样 function showPic(currPic) { var srcLoc = currPic.getAttribute("href"); var placeHolder = docu
function showPic(currPic) {
var srcLoc = currPic.getAttribute("href");
var placeHolder = document.getElementById("placeholder");
placeHolder.setAttribute("src", srcLoc);
var imgLabel = document.getElementById("imglabel");
var currLinkTitle = currPic.getAttribute("title");
imgLabel.firstChild.nodeValue = currLinkTitle;
}
function prepareGallery() {
if(!(document.getElementsByTagName && document.getElementById)) return false;
var imgGallery = document.getElementById("imagegallery");
if(imgGallery) {
var anchors = imgGallery.getElementsByTagName("a");
var i;
for(i = 0; i < anchors.length; i++) {
anchors[i].onclick = function() {
showPic(anchors[i]);
return false;
}
}
}
}
函数showPic(currPic){
var srcLoc=currPic.getAttribute(“href”);
var placeHolder=document.getElementById(“占位符”);
占位符.setAttribute(“src”,srcLoc);
var imgLabel=document.getElementById(“imgLabel”);
var currLinkTitle=currPic.getAttribute(“标题”);
imgLabel.firstChild.nodeValue=currLinkTitle;
}
函数prepareGallery(){
if(!(document.getElementsByTagName&&document.getElementById))返回false;
var imgGallery=document.getElementById(“imagegallery”);
if(imgGallery){
var-anchors=imgGallery.getElementsByTagName(“a”);
var i;
对于(i=0;i<0.length;i++){
锚[i].onclick=function(){
showPic(锚[i]);
返回false;
}
}
}
}
在匿名函数中,锚[i]提供运行时参考。单击发生时,锚定[i]
不再存在。虽然它在分配时存在,但在单击时它不在范围内(因为它只是一个数组引用)。但是,使用此
可提供对即时对象的可靠引用,该对象在单击时始终可用
更简洁地说,
archors[i]
是对数组中某个位置的引用(一旦for循环退出,该位置就会离开作用域)这是对dom元素本身的引用。在匿名函数中,锚[i]提供运行时引用。单击发生时,锚定[i]
不再存在。虽然它在分配时存在,但在单击时它不在范围内(因为它只是一个数组引用)。但是,使用此
可提供对即时对象的可靠引用,该对象在单击时始终可用
更简洁地说,archors[i]
是对数组中某个位置的引用(一旦for循环退出,该位置就会离开作用域)这是对dom元素本身的引用。因为这也可以工作:showPic(document.getElementById(anchors[i].id))代码>-你现在就“得到”了吗(非常有意思的双关语)?因为这也会起作用:showPic(document.getElementById(anchors[i].id))代码>-你现在“明白”了吗(非常有意思的双关语)?没有看到关于闭包是如何工作的明显陈述,所以下面是我的看法
var i;
for(i = 0; i < anchors.length; i++) {
anchors[i].onclick = function() {
showPic(anchors[i]);
return false;
}
}
我没有看到关于闭包如何工作的明显声明,所以下面是我的看法
var i;
for(i = 0; i < anchors.length; i++) {
anchors[i].onclick = function() {
showPic(anchors[i]);
return false;
}
}
这里有一个“无聊”的时刻。这是非常清楚的,对我来说应该是显而易见的。非常感谢你的解释,Joel。@FabrizioMachadoshowPic(锚[i])如果您将锚定声明为全局变量(没有var前缀),那么code>也会起作用-它们永远不会超出范围…这里有一个“duh”时刻。这是非常清楚的,对我来说应该是显而易见的。非常感谢你的解释,Joel。@FabrizioMachadoshowPic(锚[i])如果您将锚定声明为全局变量(没有var前缀),那么code>也可以工作-它们永远不会超出范围。。。