मैं जावास्क्रिप्ट में अनाम कार्यों के लिए तर्क कैसे पारित कर सकता हूं?


83

मैं यह पता लगाने की कोशिश कर रहा हूं कि जावास्क्रिप्ट में अनाम फ़ंक्शन के लिए तर्क कैसे पारित करें।

इस नमूना कोड को देखें और मुझे लगता है कि आप देखेंगे कि मेरा क्या मतलब है:

<input type="button" value="Click me" id="myButton" />

<script type="text/javascript">
    var myButton = document.getElementById("myButton");
    var myMessage = "it's working";
    myButton.onclick = function(myMessage) { alert(myMessage); };
</script>

बटन पर क्लिक करते समय संदेश: it's workingप्रकट होना चाहिए। हालांकि myMessageअनाम फ़ंक्शन के अंदर चर शून्य है।

jQuery बहुत सारे अनाम कार्यों का उपयोग करता है, उस तर्क को पारित करने का सबसे अच्छा तरीका क्या है?


जवाबों:


72

आपके विशिष्ट मामले को काम करने के लिए ठीक किया जा सकता है:

<script type="text/javascript">
  var myButton = document.getElementById("myButton");
  var myMessage = "it's working";
  myButton.onclick = function() { alert(myMessage); };
</script>

यह उदाहरण काम करेगा क्योंकि अनाम हैंडलर को तत्व के रूप में बनाया और असाइन किया गया है, इस संदर्भ में परिभाषित चर तक पहुंच होगी जहां इसे बनाया गया था।

रिकॉर्ड के लिए, एक हैंडलर (जिसे आप onxxx प्रॉपर्टी सेट करने के माध्यम से असाइन करते हैं) को एकल तर्क से यह अपेक्षा होती है कि वह DOM द्वारा पास की जा रही ईवेंट ऑब्जेक्ट है, और आप वहां अन्य तर्क पास करने के लिए बाध्य नहीं कर सकते।


27

आपने जो किया है वह काम नहीं करता है क्योंकि आप किसी समारोह को किसी समारोह में बाँध रहे हैं। जैसे, यह ईवेंट है जो उन मापदंडों को परिभाषित करता है, जिन्हें ईवेंट के उठाए जाने पर बुलाया जाएगा (यानी जावास्क्रिप्ट आपके द्वारा उस फ़ंक्शन में अपने पैरामीटर के बारे में नहीं जानता है जिसे आपने क्लिक करने के लिए बाध्य किया है ताकि उसमें कुछ भी पारित न हो सके)।

हालाँकि आप ऐसा कर सकते हैं:

<input type="button" value="Click me" id="myButton"/>

<script type="text/javascript">

    var myButton = document.getElementById("myButton");

    var myMessage = "it's working";

    var myDelegate = function(message) {
        alert(message);
    }

    myButton.onclick = function() { 
        myDelegate(myMessage);
    };

</script>

मैं यह नहीं देख सकता, कि संदेश को लैम्ब्डा द्वारा कैसे समझा जाता है, जो मायडेलगेट को उसका रिटर्न वैल्यू प्रदान करता है। मैंने समारोह (जैसे, बी) {// कोड यहाँ} (ए, बी) की तरह लैंबडास देखा है;
डैनियल एन।

21

समस्या को दूर करने के लिए क्लोजर का उपयोग करने के लिए निम्नलिखित विधि है, जिसे आप संदर्भित करते हैं। यह इस तथ्य को भी ध्यान में रखता है कि जो बाध्यकारी को प्रभावित किए बिना समय के साथ संदेश को बदल सकता है। और यह succinct होने के लिए jQuery का उपयोग करता है।

var msg = (function(message){
  var _message = message;
  return {
    say:function(){alert(_message)},
    change:function(message){_message = message}
  };
})("My Message");
$("#myButton").click(msg.say);

मैं सीख रहा हूँ। आप क्यों असाइन करते हैं _message? सिर्फ उपयोग क्यों नहीं message?
जोनाथन एम।

इस मामले में मैं ऐसा कर रहा हूं ताकि परिवर्तन विधि के आंतरिक दायरे में एक वैध हस्ताक्षर हो, अन्यथा बाहरी बंद में संदेश मूल्य को बदलने का कोई तरीका नहीं होगा।
गेब्रियल

एक बंद का उपयोग कर महान जवाब। हालांकि, मैं "परिवर्तन" फ़ंक्शन तर्क का नाम बदलूंगा क्योंकि "संदेश" भ्रामक है, यह स्पष्ट होना चाहिए कि यह बाहरी "संदेश" तर्क से संबंधित नहीं है। वह फ़ंक्शन इस तरह से फिर से सक्रिय किया जा सकता है: परिवर्तन: फ़ंक्शन (newmessage) {_ संदेश = newmessage}
मैट्टे-सॉफ्टनेट

8

अनाम फ़ंक्शन से पैरामीटर को हटाने से शरीर में उपलब्ध हो जाएगा।

    myButton.onclick = function() { alert(myMessage); };

अधिक जानकारी के लिए 'जावास्क्रिप्ट क्लोजर' खोजें


जैसा कि आपने कहा कि मुझे "जावास्क्रिप्ट क्लोजर" पर पढ़ने की आवश्यकता है .. धन्यवाद!
हक्सर

6

ईवेंट हैंडलर एक पैरामीटर की अपेक्षा करते हैं जो ईवेंट है जिसे निकाल दिया गया था। आपका नाम बदलकर 'myMessage' हो गया है और इसलिए आप अपने संदेश के बजाय ईवेंट ऑब्जेक्ट को अलर्ट कर रहे हैं।

एक क्लोजर आपको फ़ंक्शन के बाहर परिभाषित चर का संदर्भ देने की अनुमति दे सकता है, लेकिन यदि आप जक्वेरी का उपयोग कर रहे हैं, तो आप इसके ईवेंट विशिष्ट एपीआई जैसे देखना चाहते हैं।

http://docs.jquery.com/Events/bind#typedatafn

यह आपके अपने डेटा में पास होने का विकल्प है।


3
<input type="button" value="Click me" id="myButton" />

<script type="text/javascript">
    var myButton = document.getElementById("myButton");

    myButton.myMessage = "it's working";

    myButton.onclick = function() { alert(this.myMessage); };


</script>

यह मेरे परीक्षण सूट में काम करता है जिसमें IE6 + से सब कुछ शामिल है। अनाम फ़ंक्शन उस ऑब्जेक्ट के बारे में जानता है जो उसका है इसलिए आप उस ऑब्जेक्ट के साथ डेटा पास कर सकते हैं जो इसे कॉल कर रहा है (इस मामले में myButton)।


1

उदाहरण:

<input type="button" value="Click me" id="myButton">
<script>
    var myButton = document.getElementById("myButton");
    var test = "zipzambam";
    myButton.onclick = function(eventObject) {
        if (!eventObject) {
            eventObject = window.event;
        }
        if (!eventObject.target) {
            eventObject.target = eventObject.srcElement;
        }
        alert(eventObject.target);
        alert(test);
    };
    (function(myMessage) {
        alert(myMessage);
    })("Hello");
</script>

एक परिवर्तन: EventObject = eventObject || window.event; एक और बदलाव: eventObject = eventObject || window.event || {};
आंखों की रोशनी

एक और बदलाव: eventObject.target = eventObject.target || eventObject.srcElement || शून्य;
आंखों की रोशनी

1

प्रतिनिधियों:

function displayMessage(message, f)
{
    f(message); // execute function "f" with variable "message"
}

function alerter(message)
{
    alert(message);
}

function writer(message)
{
    document.write(message);
}

प्रदर्शन प्रदर्शन समारोह चल रहा है:

function runDelegate()
{
    displayMessage("Hello World!", alerter); // alert message

    displayMessage("Hello World!", writer); // write message to DOM
}

0

आपने जो किया है वह एक नया अनाम फ़ंक्शन है जो एकल पैरामीटर लेता है जो तब फ़ंक्शन के अंदर स्थानीय चर myMessage को सौंपा जाता है। चूंकि कोई तर्क वास्तव में पारित नहीं होता है, और ऐसे तर्क जो किसी मूल्य से पारित नहीं होते हैं, अशक्त हो जाते हैं, आपका कार्य केवल चेतावनी (अशक्त) करता है।


0

अगर आप इसे लिखेंगे

myButton.onclick = function() { alert(myMessage); };

यह काम करेगा, लेकिन मुझे नहीं पता कि क्या आपके सवालों का जवाब है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.