2016-10-09 1 views
-1

Es war mein Eindruck, dass ich Argumente an eine Funktion übergeben konnte, indem Sie bind verwenden und dann diese Argumente aufrufen, als ob sie normal übergeben worden wären. Warum muss ich dies tun:Warum scheint bind Argumente als Arrays darzustellen?

$(document).ready(function() { 
    var func = function(button) { 
    button[0].on('click', function() { 
     alert('Hello World.'); 
    }) 
    } 
    func.bind(null, [$('.button')])(); 
}); 

Wenn es scheint, wie sollte ich in der Lage sein, nur dies zu tun:

$(document).ready(function() { 
    var func = function(button) { 
    button.on('click', function() { 
     alert('Hello World.'); 
    }) 
    } 
    func.bind(null, [$('.button')])(); 
}); 

Beispiel, die Behandlung des button Argument als Array:

$(document).ready(function() { 
 
    var func = function(button) { 
 
    button[0].on('click', function() { 
 
     alert('Hello World.'); 
 
    }) 
 
    } 
 
    func.bind(null, [$('.button')])(); 
 
});
html, body, div { 
 
    padding:0; 
 
    margin:0; 
 
    display:flex; 
 
    justify-content:center; 
 
} 
 

 
.button { 
 
    background-color:gray; 
 
    margin:50px; 
 
    padding:50px; 
 
    width:50%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<div class="button">Button</div>

+1

Es behandelt es als ein Array, weil Sie ein Array binden. –

Antwort

3

bind() wird verwendet, um den aktuellen aufrufenden Bereich an eine Funktion zu binden, so dass selbst wenn Sie es von woanders aufrufen, es über lokale Variablen in diesem gebundenen Bereich wissen wird.

Was Sie suchen, ist apply().

var func = function(button) { 
 
    button.on('click', function() { 
 
    console.log('hello world'); 
 
    }); 
 
} 
 

 
func.apply(this, [$('.button')]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button class="button">Click Me</button>

Der Vollständigkeit halber ist es auch eine call() Funktion, die häufiger verwendet wird. Anstatt eines Arrays von Argumenten verwendet es eine Liste von Argumenten nach dem anfänglichen Argument des Bereichs.

func.call(this, $('.button')); 
+2

'.apply()' ist besser, aber selbst das macht hier nicht viel Sinn, wenn '.call()' stattdessen verwendet werden könnte. Vergessen Sie nicht, das nachstehende '()' ' –

+1

zu entfernen. Ah ja, ich habe das nachstehende'() 'verpasst. Ich schlug ursprünglich auch 'call()' vor, aber es schien, als ob das OP in der Lage sein würde, ein Array von Argumenten zu übergeben, also ist 'apply()' der korrekteste Ansatz. – Soviut

+0

Ich sehe, ja, wenn das OP bereits ein Array hat dann '.apply()' ist die Lösung. –

2

Sie verwenden .bind falsch. Sie sollten es nicht eine Reihe von Argumenten geben, sollten Sie nur die Argumente selbst geben:

function print(x, y, z) { 
 
    console.log(x, y, z);  
 
} 
 

 
print12 = print.bind(null, 1, 2); 
 

 
print12(3); // 1, 2, 3

Auch als Soviut erwähnt, wenn Sie .bind(...)() anrufen, Sie wollen wahrscheinlich .apply() oder .call() stattdessen.

+0

Oh, was ist, wenn ich eine dynamische Anzahl von Argumenten habe, die ich an die Funktion übergeben möchte? Edit: Ich sehe, die obige Antwort zeigt die, die ich verwenden muss ist "apply" – curiosity5678

+0

@ curiosity5678 Verwenden Sie so etwas wie ['.apply (null, [arg1, arg2, arg3, ...])'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/apply) – Frxstrem

+0

@ curiosity5678 Wenn Sie 'bind' mit einer dynamischen Anzahl von Argumenten aufrufen wollen, verwenden Sie' Function.bind.apply (myFunction , [thisValue, arg1, arg2/* ... * /]) ' – Oriol

Verwandte Themen