2013-06-19 167 views
0

我对javascriptjquery相当陌生。我以为我已经学会了足够的这样做,但显然不是。我认为这个代码是相当自我解释的。Javascript函数未定义?

问题是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(),但它似乎不有所作为

+0

我已经更新了压痕和格式相匹配的原帖,并留下故意失踪的报价。如果缺少报价是抄录错误,请更新您问题中的代码。 – zzzzBov

+0

另外,如果你还没有,请查看[编辑帮助](http://stackoverflow.com/editing-help)。 – zzzzBov

+0

不知道如何发生。我想我在粘贴时不小心将它分解了。我的代码很好。无论如何,这不是问题。不管怎么说,还是要谢谢你。 – user2436606

回答

4

无法访问的方式updown值,你”已经写了。你需要简单地调用down()ArrowDir身体内,除非你已经添加了这些功能的ArrowDir返回值:

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

或者,如果你不使用ArrowDir比其他任何封装updown功能,你应该只声明ArrowDir为对象,并调用ArrowDir.up()ArrowDir.down()

var ArrowDir = { 
    up: function() { 
     ... 
    }, 
    down: function() { 
     ... 
    } 
} 
2

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

下面是它的运行方式,在散文:

  • 定义一个函数ArrowDir
  • 准备就绪后,附加一个单击处理
  • 点击时,调用ArrowDir
    • ArrowDir,定义了两个局部变量updown,每一个功能做一些事情。
    • 没有return语句,因此返回任何
  • 调用“无”对象的down方法。 ERROR

看到了吗?

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

0

您在ArrowDir中定义的var上下无法在该函数的范围之外访问。

你能解决这个问题,如果这是一个一次性的一种功能最简单的方法,就是把向上/向下的行为在你的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()应该工作。

+0

'this'指的是gobal范围,而不是函数的返回值... –

+0

是的,你说得对。输入速度太快... – Andrew

+0

@Kolink - 编辑,你介意undownvoting? – Andrew

0

ArrowDir().down()这是你的问题。仅仅因为你在ArrowDir函数中定义了一个变量并没有使它成为它的一个方法/属性。你必须使用Prototype Inheritance。

编辑:

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

现在,您可以拨打ArrowDir.down()。 这样做会扩展对象ArrowDir的属性(它可以执行的操作)。你正在给它添加一个方法。

+0

“你必须使用原型继承” - 谨慎解释如何? –

+0

我认为这个视频可以解释得更好,然后我可以: https:// tutsplus。com/lesson/prototypal-inheritance-and-refactoring-the-slider/ –

+0

请参阅[this](http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-真正的好答案)MSO回答。 –

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 
    }; 
}); 
+0

对不起,但没有。这只会在函数调用是'new ArrowDir()。down()'时才起作用。 –

+0

@Kolink是的,但是这有什么问题。 – PSL

+0

它增加了过度的复杂性? –