0

我对javascript和相当陌生jquery。我以为我已经学到了足够的东西来做到这一点,但显然不是。我认为代码是相当不言自明的。

问题是这ArrowDir显然是未定义的。它对我来说看起来很明确,但我确定我错过了一些明显的东西。

function ArrowDir(){
    var up = function(){
        $("#arrow").attr('src','up_arrow.jpg');
    };

    var down = function(){
        $("#arrow").attr('src','down_arrow.jpg');
    };
}

$(function () {
    if($("#toggle").onclick){
        ArrowDir().down();
    };
});

我尝试将函数分配为变量,var ArrowDir = function()但似乎没有什么区别

4

5 回答 5

4

您无法以您编写的方式访问upand值。down您只需down()ArrowDir正文中调用,除非您已将这些函数添加到ArrowDir返回值:

ArrowDir() {
  var up = ...;
  var down = ...;
  return {
    up: up,
    down: down
  };
}

或者,如果您不用于封装and函数ArrowDir以外的任何东西,您应该只声​​明为一个对象,然后调用and :updownArrowDirArrowDir.up()ArrowDir.down()

var ArrowDir = {
    up: function () {
        ...
    },
    down: function () {
        ...
    }
}
于 2013-06-19T15:56:48.500 回答
2

假设后面缺少的引号"#toggle是一个错字,我不确定您希望您的代码如何工作。

这是它的运行方式,散文:

  • 定义一个函数ArrowDir
  • 准备好后,附加一个点击处理程序
  • 单击时,调用ArrowDir
    • ArrowDir中,定义两个局部变量updown,每个变量都有一个函数来做某事。
    • 没有return声明,所以什么都不返回
  • 调用down“无”对象的方法。错误

看?

尝试添加return {up:up,down:down};ArrowDir函数的末尾。

于 2013-06-19T15:56:55.543 回答
0

您在 ArrowDir 中定义的 var up 和 down 在该函数范围之外是不可访问的。

如果这是一种一次性的函数,您可以解决此问题的最简单方法就是将向上/向下行为放在 jQuery 函数中,如下所示:

$(function () {
    if($("#toggle").onclick){
        $("#arrow").attr('src','up_arrow.jpg');
    } else {
        $("#arrow").attr('src','down_arrow.jpg');
    }
});

如果您只想命名这些函数以实现可重用性,则可以改为创建一个对象文字:

ArrowDir = {
  up: function(){
    $("#arrow").attr('src','up_arrow.jpg');
  },
  down: function(){
    $("#arrow").attr('src','down_arrow.jpg');
  }
};

然后你可以调用:ArrowDir.up()ArrowDir.down()其他地方。

对于它的价值,如果您的目标只是为这些函数命名以实现可重用性,我会说对象文字语法对我来说更有意义。

或者,如果您真的想将其作为函数调用来执行,正如 Kolink 指出的那样,向上/向下函数需要在返回值中。你可以这样写...

function ArrowDir() {
  var up = function(){
    $("#arrow").attr('src','up_arrow.jpg');
  }
  var down = function(){
    $("#arrow").attr('src','down_arrow.jpg');
  }
  return {up:up,down:down};
}

或者像这样...

function ArrowDir() {
  return {
    up: function(){
      $("#arrow").attr('src','up_arrow.jpg');
    },
    down: function(){
      $("#arrow").attr('src','down_arrow.jpg');
    }
  };
}

现在打电话ArrowDir().down()应该可以了。

于 2013-06-19T15:57:23.373 回答
0

ArrowDir().down()这是你的问题。仅仅因为您在 ArrowDir 函数中定义了一个变量并不能使它成为它的方法/属性。您必须使用原型继承。

编辑:

//Something like this:
ArrowDir.prototype.down = function() {
    //Do stuff
}

现在您可以调用ArrowDir.down(). 这样做会扩展对象的属性(它可以做的事情)ArrowDir。你正在向它添加一个方法。

于 2013-06-19T15:57:49.720 回答
0

您可以通过这种方式创建对象。在您的功能中,您正在创建它们本身的范围。所以外面无法访问。

function ArrowDir() {


}
ArrowDir.prototype.up = function () {
    $("#arrow").attr('src', 'up_arrow.jpg');
};

ArrowDir.prototype.down = function () {
    $("#arrow").attr('src', 'down_arrow.jpg');
}

并以

$(function () {
    if($("#toggle").onclick){
      var arrow =  new ArrowDir(); // call the constructor to create a new instance
      arrow.down(); // invoke the method
    };
});
于 2013-06-19T15:58:10.707 回答