2016-08-04 6 views
0

Dies funktioniert:Warum können Funktionen Variablen nicht zugewiesen werden und behalten ihre Funktionalität?

var foo = $("#bar"); 
foo.html("Hello."); 

Dies gilt nicht:

var foo = $("#bar").html; 
foo("Hello."); 

Was die Funktionalität bricht?

+2

Ich denke, der zweite Aufruf wird im Bereich 'window' laufen –

+0

Wahrscheinlich, weil Aufruf von [' .html (htmlString) '] (http://api.jquery.com/html/#html2) und Übergabe eines Wertes zurückgibt [ 'jQuery'] (http://api.jquery.com/html/) (eine Instanz des jQuery-Objekts), wie in den Dokumenten angegeben. Wenn Sie die Funktionsreferenz speichern, kann die Objektreferenz verloren gehen. Nur eine Vermutung. – War10ck

Antwort

4

Gut, das sollte:

var bar = $("#bar"); 
var foo = bar.html.bind(bar); 
foo("Hello."); 

In Ihrem zweiten Beispiel verlor die HTML-Funktion ihren Aufruf Kontext, wenn Sie es auf die foo Variablen zugewiesen.

+2

Oder ändern Sie 'foo (" Hello. ");' In 'foo.call ($ (" # bar ")," Hello. ")' ' –

-2

Wenn Sie die HTML-Methode aufrufen, müssen Sie die Argumente zu diesem Zeitpunkt übergeben. Einfach gesagt, es funktioniert einfach nicht so. Wenn Sie eine

var myHtml = 'hello world'; 
    var foo = $('#bar').html(myHtml); 

würden Sie finden, es funktioniert. Beim Aufruf einer Methode sollten die Argumente damit verknüpft sein ... Sie weisen dem Jquery-Objekt im Wesentlichen eine Eigenschaft 'html' zu und überschreiben die Methode. Ich bin ziemlich sicher, ...

+1

Das OP fragt, warum er eine * Referenz * auf die 'html()' Methode in einer Variablen nicht speichern kann - was eine vollkommen gültige Sache ist. –

4

jQuery Referenzen this, wenn Sie ihre Funktionen aufrufen. Wir können Ihr Beispiel funktionieren lassen, wenn wir this mit etwas wie bind setzen.

https://jsfiddle.net/ripter/6hbqtn5j/

// Normal case 
 
//$('#bar').html('<h1>Hello World</h1>'); 
 

 
// save the html function for later 
 
// jQuery relies on 'this', so we have to make sure we keep that reference. 
 
var barHtml = $('#bar').html.bind($('#bar')); 
 
barHtml('<h1>Hello from function reference</h1>');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="bar"> 
 

 
</div>

2

Der Grund für die Referenz von html() nicht in Ihrem Beispiel nicht funktioniert, weil der Umfang der this hat innerhalb der Funktion geändert, wenn Sie es nennen.

Im normalen Beispiel (z. B. $('#bar').html('Hello.')) bezieht sich this auf die DOMElements, die im jQuery-Objekt enthalten sind.

In der Funktionsreferenz wurde die Version this geändert, um auf window zu zeigen. Um dies zu beheben, müssen Sie die html() Methodenreferenz aufrufen, die den Bereich this mit call() angibt. Wie Sie aus dem folgenden Beispiel sehen können, ist dies nicht sehr hilfreich, da Sie das DOM dann zweimal aufrufen müssen, um das #bar Element abzurufen.

var foo = $("#bar").html; 
 
foo.call($("#bar"), "Hello.");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="bar"></div>

bind() würde auch das gleiche Ergebnis erreichen, und haben genau die gleichen Nachteil.

Verwandte Themen