Javascript关闭和范围问题

时间:2013-02-22 00:42:52

标签: javascript jquery closures

我无法绕过javascript闭包。我想要4个随机数,但只得到最后一个重复4次。

的Javascript

$(function() {      

  function setNewNumber(element) {
    return function (newNumber) {
      element.text(newNumber);
    }
  }

  $('.number').each(function() {
      $.get('http://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new', 
        setNewNumber($(this))
      );
  });

});

HTML

<div class="number"></div>
<div class="number"></div>
<div class="number"></div>
<div class="number"></div>

A working plunker example

任何提示?

4 个答案:

答案 0 :(得分:4)

正在缓存get请求。

http://jsfiddle.net/hCEbd/1/

(也就是说你对闭包的理解是正确的,代码工作正常)。

来自评论,因为这是相关的:

  

您可以根据其API在同一个计时器上从random.org请求多个号码。而不是使用四个请求,使用num=' + $(".number").length然后进行一些解析

答案 1 :(得分:0)

使用您的顶级功能尝试实现的目标有点令人困惑。如果您只想将新的随机数设置为元素,则不需要其中任何一个。

使用ajax为您的请求指定一些参数。特别是,您希望停止缓存您的请求。您还可以提供上下文来引用您的.number元素。

$('.number').each(function() {
  $.ajax({
      type: "GET",
      url: 'http://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new',
      context: this,
      success: function(data) { 
        $(this).text(data); 
      },
      cache: false
  });
});

此解决方案摆弄here.

答案 2 :(得分:-1)

作品:http://plnkr.co/edit/XTOI20kGbFbzdtDaqpLZ

您的请求正在缓存中。顺便说一句,在循环中获取数据 - 这不是一个好主意。

答案 3 :(得分:-1)

任何jquery ajax请求(如$ .get)都会更改范围。如果要重用setNewWord函数,则需要在get的结果中全局作用域或作用域。

看看jsfiddle。 http://jsfiddle.net/justengland/hJnXb/2/

function setNewWord(element) {
$('#output').append(element + '<br>');

}

$(function(){

$(numbers).each(function () {
    var url = 'http://www.random.org/integers/?num=1&min=1&max=6&col=1&base=10&format=plain&rnd=new';
    $.get(url, setNewWord);
});

});