Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterungen zu den Funktionen gelten und rufen in JS auf

Detaillierte Erläuterungen zu den Funktionen gelten und rufen in JS auf

一个新手
一个新手Original
2017-09-26 09:36:091638Durchsuche

Der Unterschied zwischen apply und call

Die ECMAScript-Spezifikation definiert zwei Methoden, call und apply, für alle Funktionen. Sie werden häufig verwendet und ihre Funktionen sind bis auf genau gleich Übergabe von Parametern. Die Form ist einfach anders. Die

apply( )

apply-Methode übergibt zwei Parameter: Einer ist das Objekt als Funktionskontext und der andere ist ein Array aus Funktionsparametern.

var obj = {
    name : 'linxin'}function func(firstName, lastName){
    console.log(firstName + ' ' + this.name + ' ' + lastName);}func.apply(obj, ['A', 'B']);    // A linxin B

Wie Sie sehen können, ist obj das Objekt, das als Funktionskontext verwendet wird, und dies zeigt in der Funktion func auf das Objekt obj. Die Parameter A und B werden im Array platziert und an die Funktion func übergeben, entsprechend den Listenelementen des Parameters func.

call( )

Der erste Parameter der Call-Methode ist auch das Objekt des Funktionskontexts, aber was später übergeben wird, ist eine Parameterliste anstelle eines einzelnen Arrays.

var obj = {
    name: 'linxin'}function func(firstName, lastName) {
    console.log(firstName + ' ' + this.name + ' ' + lastName);}func.call(obj, 'C', 'D');       // C linxin D

Beim Vergleich können wir sehen, dass C und D als separate Parameter an die Funktion func übergeben werden, anstatt in einem Array platziert zu werden.

Sie müssen sich keine Gedanken darüber machen, wann Sie welche Methode anwenden. Wenn Ihre Parameter bereits in einem Array vorhanden sind, verwenden Sie natürlich apply. Wenn die Parameter verstreut sind und keine Korrelation zueinander aufweisen, verwenden Sie call.

Verwendung von apply und call

1. Ändern Sie dies so, dass es auf

var obj = {
    name: 'linxin'}function func() {
    console.log(this.name);}func.call(obj);       // linxin

zeigt. Wir wissen, dass der erste Parameter der Aufrufmethode ist Als Funktionskontextobjekt wird obj als Parameter an func übergeben, und dies zeigt in der Funktion auf das obj-Objekt. Die Funktion func entspricht hier tatsächlich

function func() {
    console.log(obj.name);}

2. Ausleihen von Methoden von anderen Objekten

Schauen wir uns zuerst das Beispiel an

var Person1  = function () {
    this.name = 'linxin';}var Person2 = function () {
    this.getname = function () {
        console.log(this.name);
    }
    Person1.call(this);}var person = new Person2();person.getname();       // linxin

Aus dem Obigen sehen wir dass Person2 Das instanziierte Objekt Person erhält den Namen in Person1 über die Methode getname. Da in Person2 die Funktion von Person1.call(this) darin besteht, das Person1-Objekt anstelle dieses Objekts zu verwenden, verfügt Person2 über alle Eigenschaften und Methoden in Person1, was dem Erben der Eigenschaften und Methoden von Person1 durch Person2 entspricht.

3. Aufrufen von Funktionen

Die Methoden apply und call bewirken, dass die Funktion sofort ausgeführt wird, sodass sie auch zum Aufrufen von Funktionen verwendet werden können.

function func() {
    console.log('linxin');}func.call();            // linxin

Der Unterschied zwischen call und bind

Eine Methode namens bind wurde in EcmaScript5 erweitert, das nicht mit niedrigeren Versionen des IE kompatibel ist. Es ist dem Aufruf sehr ähnlich. Der erste Parameter ist das Objekt als Funktionskontext und der zweite Teil des Parameters ist eine Liste, die mehrere Parameter akzeptieren kann.
Die Unterschiede zwischen ihnen sind wie folgt.

1.bind gibt eine Funktion zurück

var obj = {
    name: 'linxin'}function func() {
    console.log(this.name);}var func1 = func.bind(obj);func1();                        // linxin

Bind-Methode wird nicht sofort ausgeführt, sondern gibt eine Funktion zurück, die den Kontext ändert. Dies wurde jedoch in der ursprünglichen Funktion func nicht geändert und zeigt weiterhin auf das globale Objektfenster.

2. Verwendung von Parametern

function func(a, b, c) {
    console.log(a, b, c);}var func1 = func.bind(null,'linxin');func('A', 'B', 'C');            // A B Cfunc1('A', 'B', 'C');           // linxin A Bfunc1('B', 'C');                // linxin B Cfunc.call(null, 'linxin');      // linxin undefined undefined

Aufruf übergibt den zweiten und die folgenden Parameter als tatsächliche Parameter der func-Methode, während die tatsächlichen Parameter der func1-Methode tatsächlich in bind sind Fahren Sie mit den Parametern fort.

在低版本浏览器没有 bind 方法,我们也可以自己实现一个。

if (!Function.prototype.bind) {
    Function.prototype.bind = function () {
        var self = this,                        // 保存原函数
            context = [].shift.call(arguments), // 保存需要绑定的this上下文
            args = [].slice.call(arguments);    // 剩余的参数转为数组
        return function () {                    // 返回一个新函数
            self.apply(context,[].concat.call(args, [].slice.call(arguments)));
        }
    }}

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterungen zu den Funktionen gelten und rufen in JS auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn