【问题标题】:referencing function inside a for loop in js在js中的for循环内引用函数
【发布时间】:2013-07-24 22:32:00
【问题描述】:

我有以下代码:

function fn_get_natural_dim(){
    var width = this.width;
    var height = this.height;

    var ratiow = width/600;
    var ratioh = height/300;
    $("#output").append(img_name,",");

    if(ratiow>=ratioh)
        {
        height = height/ratiow;
        $(slide_image).css("width","600px");
        $(slide_image).css("height",height);
        var margin = (300-height)/2;
        $(slide_image).css("margin-top",margin);
        }
    else
        {
        width = width/ratioh;
        $(slide_image).css("width",width);
        $(slide_image).css("height","300px");
        var margin = (600-width)/2;
        $(slide_image).css("margin-left",margin);
        }
}
var max_count = $(".slider").children().length;
for(var count=1;count<=max_count;count++)
    {
    var count_string = count.toString();
    var img_name = "img" + count_string;
    var slide_image = document.getElementById(img_name);

    var img = new Image();
    img.onload = fn_get_natural_dim;
    img.src = $(slide_image).attr("src");
    }
});

对于每张图片(我目前有三张),我会得到它的自然尺寸,这样我就可以计算出适合 600x300 div 所需的边距。

但我只适用于最后一个,即第三个。 换句话说,在#output 中,它显示“img3,img3,img3”(由 $("#output").append(img_name,","); 调用) 如何让它显示“img1,img2,img3”??

【问题讨论】:

  • 不到一小时前你问了同样的问题。
  • @Barmar 这不是完全相同的问题 - 这段代码(在某种程度上)用我对上一个问题的答案进行了修复。现在 OP 有一个不同的问题。
  • @Alnitak 是的,我有点过分了。

标签: javascript jquery function for-loop


【解决方案1】:

你可以这样做:

    img.onload = (function(img_name, slide_image) {
        return function() {fn_get_natural_dim(img_name, slide_image); };
    })(img_name, slide_image);

并更改fn_get_natural_dim 以将图像名称作为参数:

function fn_get_natural_dim(img_name, slide_image) {

以上代码在闭包变量中捕获img_name 的每个连续值。

【讨论】:

  • 通过“更改 fn_get_natural_dim 以将图像名称作为参数。”你的意思是让它到 fn_get_natural_dim(img_name) ?
  • 是的,我就是这个意思。
  • 嗯,它似乎不起作用。首先,由于某种原因,#output 显示“#img1,#img3,#img2”并且#img1 和#img2 的边距没有改变,并且#img3 由于某种原因变得太大
  • 您在onload 处理程序中运行它,并且图像不一定会按照您启动它们的顺序完成加载。它们将以加载的任何顺序显示。
  • 我明白了。好吧,我想这不是太大的问题。但边距似乎无法正常工作
【解决方案2】:

编辑

正如 Barmar 指出的那样,这个解决方案并不完全正确。我会留下它,因为这是一个相当常见的错误,重要的是要注意他的解决方案和我自己的解决方案之间的区别。


img_name 传递到您的fn_get_natural_dim 函数中:

function fn_get_natural_dim( img_name ) { ... }

然后这样称呼它:

img.onload = function() { fn_get_natural_dim(img_name); };

【讨论】:

  • 那行不通,因为img_name 不是闭包变量。你需要一个包装函数来关闭它。
  • @Barmar:为什么不呢?从我的角度来看,该函数可以访问 img_name,因为它是在循环内定义的。
  • 但是循环在JS中不是变量作用域。所以每次迭代都引用相同的img_name 变量。
  • 然后您可以创建一个新范围来绑定值,如果需要使用新函数。
  • @zkar Barmar 是正确的。见stackoverflow.com/questions/643542/…
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
相关资源
最近更新 更多