【问题标题】:How to call a function that is inside another function?如何调用另一个函数内部的函数?
【发布时间】:2016-08-20 14:27:49
【问题描述】:

我正在尝试用 jQuery && JavaScript 制作一个简单的图像滑块。我开始拓展业务,弄清楚自己并遇到这个问题更像是一件私人的事情。我想在更改var count 的值后调用函数test。希望这会发送(在这种情况下)下一张图片。

var sc;
var count;

  setInterval(function test(){
      $(".slider #"+count).show("slide",{direction:'right'},500);

      $(".slider #"+count).delay(5500).hide("slide",{direction:'left'},500);

      if(count==sc || count > sc || count <= 0) {
        count=1;
      }else{
        count=count + 1;
      }
  }, 6500);

  function slider(){
    sc=$(".slider img").length;
    count= 2;

    $(".slider #1").show("fade", 500);
    $(".slider #1").delay(5500).hide("slide",{direction:'left'},500);
}


function prev() {
  count = count - 1;
  test();
}
function next() {
  count = count + 1;
  test();
}

HTML:

<div class="wrapper">
  <div class="slider">
    <img id="1" src="images/Background.JPG"/>
    <img id="2" src="images/Background2.jpeg"/>
    <img id="3" src="images/background2.png"/>
    <img id="4" src="images/profilePicture.jpg"/>
  </div>

  <a href="#" class="left" onclick="prev(); return false;">Previous</a>
  <a href="#" class="right" onclick="next(); return false;">Next</a>

</div>

【问题讨论】:

  • 如果你想从函数外部调用它,不要在另一个函数内部定义它。
  • 您不能从该函数外部调用另一个函数中定义的函数。它称为范围。

标签: javascript jquery html css


【解决方案1】:

为了从定义它的函数(定义它的范围)之外访问它,你必须有一个对它的引用,该引用存在于你想要的代码可见的范围内访问它。

执行此操作的最常见方法是定义要从范围内的多个位置调用的函数,该范围对您希望调用它的所有位置都是可见的。例如:

var count;
function test(){
    //Do stuff
}

function slider(){
    //code
    setInterval(test, 6500);
}

function prev() {
  count = count - 1;
  test();
}

function next() {
  count = count + 1;
  test();
}

完成同样事情的另一种方法是:

var intervalFunction;

function slider(){
    //code
    setInterval(intervalFunction = function test(){
        //Do stuff
    }, 6500);
}

function prev() {
  count = count - 1;
  intervalFunction();
}

function next() {
  count = count + 1;
  intervalFunction();
}

【讨论】:

  • 您的备用版本将无法使用,因为 test 标识符的作用域位于 test 函数的内部。您可以将分配放在我猜的函数中。每次都会重新分配,但可能无关紧要。
  • @squint 编辑:猜你打败了我哈哈我编辑了代码并将函数测试放在外面但是当我尝试点击上一个或下一个时它给了我一个未定义的函数“测试”? setInterval 是否与它的范围混淆?
  • @RyanLong:并不是setInterval 专门改变了标识符的范围,而是更普遍的事实是,命名函数被用作表达式的一部分而不是函数声明。它通常被称为命名函数表达式,正如您所注意到的,它改变了函数名称的范围。如果你做了var foo = function bar() {},那也是一样的。您可以在外面使用foo,但必须在里面使用bar
  • @RyanLong:几乎...setInterval(test, 6500)test 之后没有括号。 Makyen 的第一个解决方案就是这样。
  • @RyanLong:这就是它的工作原理。在第一个间隔之后才调用它。但是由于您现在有对test 的引用,您可以手动调用它。 setInterval(test, 6500); test()
【解决方案2】:

我想你是在问closures in JavaScript? 这就是你对函数中的函数的意思吗?

  function slider(){
    sc=$(".slider img").length;
    count= 2;

    $(".slider #1").show("fade", 500);
    $(".slider #1").delay(5500).hide("slide",{direction:'left'},500);
    return function(){return var += count }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2021-10-10
    • 2017-09-22
    • 2017-05-08
    • 1970-01-01
    • 2019-09-11
    • 2015-07-15
    相关资源
    最近更新 更多