2013-06-19 79 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

它增加了過度的複雜性? –