Javascript 在本例中,为什么我的匿名函数没有当前对象的上下文?

Javascript 在本例中,为什么我的匿名函数没有当前对象的上下文?,javascript,Javascript,当我在Google Chrome中运行此示例代码时,预期的行为——在当前页面的占位符图像标记中加载图像——不会发生。调用showPic()时,我检查了currPic的值,它是“未定义的”。我知道如果我将showPic的参数从“锚[I]”更改为“this”,那么它就会工作,但我试图理解为什么会这样 function showPic(currPic) { var srcLoc = currPic.getAttribute("href"); var placeHolder = docu

当我在Google Chrome中运行此示例代码时,预期的行为——在当前页面的占位符图像标记中加载图像——不会发生。调用showPic()时,我检查了currPic的值,它是“未定义的”。我知道如果我将showPic的参数从“锚[I]”更改为“this”,那么它就会工作,但我试图理解为什么会这样

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。@FabrizioMachado
showPic(锚[i])锚定声明为全局变量(没有var前缀),那么code>也会起作用-它们永远不会超出范围…这里有一个“duh”时刻。这是非常清楚的,对我来说应该是显而易见的。非常感谢你的解释,Joel。@FabrizioMachado
showPic(锚[i])锚定声明为全局变量(没有var前缀),那么code>也可以工作-它们永远不会超出范围。。。