Heim  >  Artikel  >  Web-Frontend  >  Wie ändere ich den Wert, auf den dies in einer Funktion in JavaScript verweist?

Wie ändere ich den Wert, auf den dies in einer Funktion in JavaScript verweist?

伊谢尔伦
伊谢尔伦Original
2017-07-20 13:34:061476Durchsuche

fun.apply(context,[argsArray])

Rufen Sie fun sofort auf und verweisen Sie gleichzeitig das ursprüngliche This der Fun-Funktion auf das neue übergebene Kontextobjekt. Implementieren derselben Methode in verschiedenen wiederverwendeten Objekten.

Kontext: das übergebene Objekt, das das ursprüngliche This der Fun-Funktion ersetzt

argsArray: ein Array oder Array-ähnliches Objekt, in dem die Array-Parameter erweitert und an Fun übergeben werden als separate Aktualparameter Bei Funktionen müssen Sie auf die Reihenfolge der Parameter achten.

fun.call(context,[arg1],[arg2],[…])

Dasselbe wie gelten, außer dass die Parameterliste unterschiedlich ist Ein eingehender Anruf muss getrennt werden. Wenn Sie die Anzahl der Parameter nicht kennen, verwenden Sie apply.

Verwendung:

Math.max() //Nur einzelne Parameter empfangen. Sie können die Max-Methode für das Array über die folgende Methode verwenden:
Math.max.apply(null , array); //Die Array-Array-Parameter werden in separate Parameter erweitert und dann an
Array.prototype.push.apply(arr1, arr2); übergeben; //Ein Array aufteilen und in ein anderes Array verschieben; anwenden Dann werden die nachfolgenden Array-Parameter als Elemente eingefügt.
Array.prototype.slice.call(arguments); //Verwenden Sie die Slice-Methode für das Klassenelementgruppenobjekt


function isArray(obj){
  return Object.prototype.toString.call(obj) === '[object Array]' ;
}  //验证是否是数组

fun .bind(context,[arg1],[arg2],[…])

sorgt dafür, dass sich der von der fun-Methode ausgeführte Kontext nie ändert.

arg1: Parameterliste, die an die neue Funktion übergeben werden soll

Gibt eine Funktion für nachfolgende Aufrufe zurück. Ihr Funktionskörper ist derselbe wie der ursprüngliche Funktionsspaß, aber dies der neuen Funktionspunkte zum neu übergebenen Kontextobjekt. Die neue Funktion verfügt über die Anfangsparameter arg1/arg2..., die durch die Bindungsmethode angegeben werden. Die tatsächlichen Parameter werden beim anschließenden Aufruf der neuen Funktion hinter den vorhandenen Parametern angeordnet.


//原来的函数有4个参数
var displayArgs = function (val1, val2, val3, val4) {
  console.log(val1 + " " + val2 + " " + val3 + " " + val4);
}
var emptyObject = {};
// 生成新函数时bind方法指定了2个参数,则新函数会带着这个两个实参
var displayArgs2 = displayArgs.bind(emptyObject, 12, "a");
// 调用时传入另2个参数,要在bind方法传入的2个实参后面
displayArgs2("b", "c");
// Output: 12 a b c

Verwenden Sie bind in der Event-Handler-Funktion:


var obj = {
  arg1 : 1,
  attach: function(){
    //var self = this; 普通传入this 的方法
    $('xxx').on('click',function (event) {
      console.log(this.arg1);//若不绑定this,回调函数中的this常指目标元素
     }.bind(this));  //使用bind方法绑定this
  }
}

Verwenden Sie die bind()-Methode, um Methode zum Umschreiben von Slice ():


var _Slice = Array.prototype.slice;
var slice = Function.prototype.call.bind(_Slice);
slice(…);

bind() ist mit der Ie5~ie8-Verarbeitung kompatibel


if (!Function.prototype.bind) {
  Function.prototype.bind = function(context) {
    var self = this, // 调用bind方法的目标函数
    args = arguments;
    return function() {
      self.apply(context, Array.prototype.slice.call(args, 1));//参数个数不确定时用apply
    }
  }
}

Allgemeine Situation Das This von setTimeout() zeigt auf das Fenster oder das globale Objekt. Wenn Sie eine Klassenmethode verwenden und diese auf eine Klasseninstanz verweisen soll, können Sie bind() verwenden, um diese an das aufrufende Objekt zu binden, anstatt self zu übergeben.

dies

Dieses Objekt ist basierend auf der Ausführungsumgebung der Funktion gebunden, wenn die Funktion ausgeführt wird: In der globalen Funktion entspricht dies dem Fenster und dem Zeitpunkt Die Funktion wird wie folgt behandelt: Wenn eine Methode eines Objekts aufgerufen wird, ist diese gleich diesem Objekt.

Beurteilungsmethode: Dies hat nichts damit zu tun, wo sie definiert ist. Wenn die Funktion ausgeführt wird, bezieht sich dies auf das Objekt vor .; wenn nicht, bezieht sich dies auf das Fenster. Wenn das Schlüsselwort new aufgerufen wird, verweist es auf ein neues Objekt. Wenn es apply/call/bind gibt, bezieht es sich auf den ersten Parameter.


/*例1*/
function foo() {
  console.log( this.a );
} 
var obj2 = {
  a: 42,
  foo: foo
};
var obj1 = {
  a: 2,
  obj2: obj2
};
obj1.obj2.foo(); // 42;当foo函数被调用时,其本身是归obj2所拥有
/*例2*/
function foo() {
  console.log( this.a );
} 
var obj = {
  a: 2,
  foo: foo
};
var bar = obj.foo;   // bar引用foo函数本身
var a = "global";   // 全局对象的属性
bar();        // "global" ;

In einem HTML-DOM-Ereignishandler zeigt dies immer auf den DOM-Knoten, an den der Handler gebunden ist.

Das obige ist der detaillierte Inhalt vonWie ändere ich den Wert, auf den dies in einer Funktion in JavaScript verweist?. 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