├ça─čr─▒ ve ba┼čvuru aras─▒ndaki fark nedir?


Al─▒nan cevaba git


Kullanma aras─▒ndaki fark nedir call ve apply bir i┼člevi ├ža─č─▒rmak i├žin?

 var func = function() {
  alert('hello!');
};
 

func.apply(); vs func.call();

Yukar─▒da belirtilen iki y├Ântem aras─▒nda performans farkl─▒l─▒klar─▒ var m─▒? Ne zaman kullanmak en iyisidir call ├╝zerinde apply tersi ve yard─▒mc─▒s─▒?


2991









Cevap say─▒s─▒n─▒ say: 21






Aradaki fark, apply fonksiyonu arguments bir dizi olarak ├ža─č─▒rman─▒za izin vermesidir ; call parametrelerin a├ž─▒k├ža listelenmesini gerektirir. Yararl─▒ bir haf─▒za olan " A i├žin bir rray ve C i├žin c OMMA."

MDN dok├╝manlar─▒na bak─▒n uygulamak ve ├ža─čr─▒ .

S├Âzde s├Âzdizimi:

theFunction.apply(valueForThis, arrayOfArgs)

theFunction.call(valueForThis, arg1, arg2, ...)

Ayr─▒ca, ES6'dan itibaren, fonksiyonla spread kullan─▒m i├žin dizinin kullan─▒m imkan─▒ call , burada uyumluluklar─▒ g├Ârebilirsiniz .

Basit kod:

 function theFunction(name, profession) {
    console.log("My name is " + name + " and I am a " + profession +".");
}
theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]);
theFunction.call(undefined, "Claude", "mathematician");
theFunction.call(undefined, ...["Matthew", "physicist"]); // used with the spread operator 


3535







K. Scott Allen bu konuda g├╝zel bir yaz─▒ yaz─▒yor .

Temel olarak, fonksiyon arg├╝manlar─▒n─▒ nas─▒l ele ald─▒klar─▒na g├Âre farkl─▒l─▒k g├Âsterir.

Uygulama () y├Ântemi call () ile ayn─▒d─▒r, ancak include () d─▒┼č─▒nda ikinci parametre olarak bir dizi gerektirir. Dizi, hedef y├Ântemin arg├╝manlar─▒n─▒ temsil ediyor. "

Yani:

 // assuming you have f
function f(message) { ... }
f.call(receiver, "test");
f.apply(receiver, ["test"]);
 

220







Her bir fonksiyonun ne zaman kullan─▒laca─č─▒na ili┼čkin k─▒sm─▒ cevaplamak i├žin, apply ge├žece─činiz arg├╝man say─▒s─▒n─▒ bilmiyorsan─▒z veya zaten bir dizi veya dizi benzeri bir nesnedeyseniz ( arguments kendi arg├╝manlar─▒n─▒z─▒ ileten nesne gibi) kullan─▒n. call Aksi takdirde, arg├╝manlar─▒ bir diziye sarmaya gerek olmad─▒─č─▒ndan kullan─▒n .

 f.call(thisObject, a, b, c); // Fixed number of arguments

f.apply(thisObject, arguments); // Forward this function's arguments

var args = [];
while (...) {
    args.push(some_value());
}
f.apply(thisObject, args); // Unknown number of arguments
 

Herhangi bir arg├╝man─▒ ge├žmedi─čimde (├Ârne─čin, ├Ârne─čin), i┼člevi ├ža─č─▒rd─▒─č─▒mdan call beri tercih ederim . i┼člevi (var olmayan) arg├╝manlara uygulad─▒─č─▒n─▒z anlam─▒na gelir . apply

apply Bir dizideki arg├╝manlar─▒ kullan─▒yorsan─▒z ve sararsan─▒z (├Ârne─čin, f.apply(thisObject, [a, b, c]) yerine f.call(thisObject, a, b, c) ) , performans farklar─▒ olmamal─▒d─▒r . Test etmedim, bu y├╝zden farkl─▒l─▒klar olabilirdi, ancak taray─▒c─▒ya ├Âzel olurdu. call Bir dizideki arg├╝manlara sahip de─čilseniz daha h─▒zl─▒ ve e─čer varsa daha h─▒zl─▒ olmas─▒ muhtemeldir apply .


154







─░┼čte g├╝zel bir an─▒msat─▒c─▒. Bir pply kullanan bir rrays ve A lways bir ya da iki Arg├╝manlar s├╝rer. Kulland─▒─č─▒n─▒zda C E─čer gereken tek ┼čey C arg├╝manlar─▒n say─▒s─▒n─▒ ount.


107


2013-09-04





Bu eski bir konu olsa da, sadece .call'─▒n .pply'tan biraz daha h─▒zl─▒ oldu─čunu belirtmek istedim. Sana tam olarak nedenini s├Âyleyemem.

Bkz. JsPerf, http://jsperf.com/test-call-vs-apply/3


[ UPDATE! ]

Douglas Crockford, ikisi aras─▒ndaki farktan k─▒saca bahseder; bu, performans fark─▒n─▒ a├ž─▒klamaya yard─▒mc─▒ olabilir ... http://youtu.be/ya4UHuXNygM?t=15m52s

Uygula, bir dizi ba─č─▒ms─▒z de─či┼čken al─▒rken, ├ça─čr─▒ s─▒f─▒r veya daha fazla bireysel parametre al─▒r! Ah hah!

.apply(this, [...])

.call(this, param1, param2, param3, param4...)


91







Michael Bolin taraf─▒ndan Kapan─▒┼č: The Definitive Guide'dan bir al─▒nt─▒ izler . Biraz uzun g├Âr├╝nebilir, ancak ├žok fazla i├žg├Âr├╝ ile doymu┼č. "Ek B. S─▒k├ža Yanl─▒┼č Anla┼č─▒lan JavaScript Kavramlar─▒" dan:


this Bir ─░┼člev ├ça─čr─▒ld─▒─č─▒nda Ne Demek?

Formun bir i┼člevini ├ža─č─▒r─▒rken foo.bar.baz() , nesneye foo.bar al─▒c─▒ denir. ─░┼člev ├ža─čr─▒ld─▒─č─▒nda, bu de─čer i├žin kullan─▒lan al─▒c─▒d─▒r this :

 var obj = {};
obj.value = 10;
/** @param {...number} additionalValues */
obj.addValues = function(additionalValues) {
  for (var i = 0; i < arguments.length; i++) {
    this.value += arguments[i];
  }
  return this.value;
};
// Evaluates to 30 because obj is used as the value for 'this' when
// obj.addValues() is called, so obj.value becomes 10 + 20.
obj.addValues(20);
 

Bir i┼člev ├ža─čr─▒ld─▒─č─▒nda a├ž─▒k bir al─▒c─▒ yoksa, genel nesne al─▒c─▒ olur. Sayfa 47'de "goog.global" b├Âl├╝m├╝nde a├ž─▒kland─▒─č─▒ gibi, bir web taray─▒c─▒s─▒nda JavaScript ├žal─▒┼čt─▒r─▒ld─▒─č─▒nda pencere genel nesnedir. Bu baz─▒ ┼ča┼č─▒rt─▒c─▒ davran─▒┼člara yol a├žar:

 var f = obj.addValues;
// Evaluates to NaN because window is used as the value for 'this' when
// f() is called. Because and window.value is undefined, adding a number to
// it results in NaN.
f(20);
// This also has the unintentional side effect of adding a value to window:
alert(window.value); // Alerts NaN
 

Olsa obj.addValues ve f ayn─▒ i┼čleve at─▒fta bulunsalar da ├ža─čr─▒ld─▒─č─▒nda farkl─▒ davran─▒rlar ├ž├╝nk├╝ al─▒c─▒n─▒n de─čeri her ├ža─čr─▒da farkl─▒d─▒r. Bu nedenle, ba┼čvuruda bulunan bir i┼člevi ├ža─č─▒r─▒rken , ├ža─čr─▒ld─▒─č─▒nda do─čru de─čere sahip this olmas─▒n─▒ sa─člamak ├Ânemlidir this . E─čer a├ž─▒k olmak gerekirse this , i┼člev g├Âvdesinde sonra davran─▒┼č─▒ ba┼čvurulan de─čildi f(20) ve obj.addValues(20) ayn─▒ olacakt─▒r.

─░┼člevler, JavaScript'te birinci s─▒n─▒f nesneler oldu─čundan, kendi y├Ântemlerine sahip olabilirler. T├╝m fonksiyonlar y├Ântemler vard─▒r call() ve apply() bu m├╝mk├╝n (yani, nesne al─▒c─▒ yeniden tan─▒mlama i├žin yapmak this belirtir) i┼člevini ├ža─č─▒ran zaman. Y├Ântem imzalar─▒ a┼ča─č─▒daki gibidir:

 /**
* @param {*=} receiver to substitute for 'this'
* @param {...} parameters to use as arguments to the function
*/
Function.prototype.call;
/**
* @param {*=} receiver to substitute for 'this'
* @param {Array} parameters to use as arguments to the function
*/
Function.prototype.apply;
 

Fonksiyon parametrelerini bireysel arg├╝manlar olarak alan call() ve aras─▒ndaki tek fark─▒n , tek bir dizi olarak apply() al─▒nd─▒─č─▒na dikkat call() edin apply() :

 // When f is called with obj as its receiver, it behaves the same as calling
// obj.addValues(). Both of the following increase obj.value by 60:
f.call(obj, 10, 20, 30);
f.apply(obj, [10, 20, 30]);
 

A┼ča─č─▒daki aramalar e┼čde─čerdir f ve obj.addValues ayn─▒ i┼člevi bak─▒n─▒z:

 obj.addValues.call(obj, 10, 20, 30);
obj.addValues.apply(obj, [10, 20, 30]);
 

Ancak, belirtilmemi┼čse al─▒c─▒ arg├╝man─▒n─▒n yerine koymak i├žin kendi al─▒c─▒n─▒n de─čerini call() ne apply() kulland─▒─č─▒ ne de , a┼ča─č─▒dakiler i┼če yaramaz:

 // Both statements evaluate to NaN
obj.addValues.call(undefined, 10, 20, 30);
obj.addValues.apply(undefined, [10, 20, 30]);
 

De─čeri this kutu asla null veya undefined bir i┼člev ├ža─čr─▒ld─▒─č─▒nda. T├╝m null veya undefined al─▒c─▒dan olarak temin edilir call() ya da apply() k├╝resel bir amac─▒ yerine al─▒c─▒ de─čeri olarak kullan─▒l─▒r. Bu nedenle, ├Ânceki kod, value genel nesneye adland─▒r─▒lm─▒┼č bir ├Âzellik eklemenin ayn─▒ istenmeyen yan etkisine sahiptir .

Bir i┼člevi, atand─▒─č─▒ de─či┼čken hakk─▒nda hi├žbir bilgisi olmayan bir ┼čey olarak d├╝┼č├╝nmek faydal─▒ olabilir. Bu, i┼člev tan─▒mland─▒─č─▒ zaman yerine i┼člev ├ža─čr─▒ld─▒─č─▒nda bunun de─čerinin s─▒n─▒rland─▒r─▒laca─č─▒ fikrini g├╝├žlendirmeye yard─▒mc─▒ olur.


├ľz├╝ sonu.


75







Bir nesnenin ba┼čka bir nesnenin i┼člevini ├Âd├╝n├ž almas─▒ zaman zaman kullan─▒┼čl─▒d─▒r, bu da ├Âd├╝n├ž verme nesnesinin ├Âd├╝n├ž verme i┼člevini kendi eylemmi┼č gibi y├╝r├╝tmesi anlam─▒na gelir.

K├╝├ž├╝k bir kod ├Ârne─či:

 var friend = {
    car: false,
    lendCar: function ( canLend ){
      this.car = canLend;
 }

}; 

var me = {
    car: false,
    gotCar: function(){
      return this.car === true;
  }
};

console.log(me.gotCar()); // false

friend.lendCar.call(me, true); 

console.log(me.gotCar()); // true

friend.lendCar.apply(me, [false]);

console.log(me.gotCar()); // false
 

Bu y├Ântemler nesnelere ge├žici i┼člevsellik vermek i├žin ├žok kullan─▒┼čl─▒d─▒r.


33







├ça─čr─▒, Uygula ve Ba─čla ile ba┼čka bir ├Ârnek. ├ça─čr─▒ Yap ve Uygula aras─▒ndaki fark a├ž─▒kt─▒r, ancak Ba─člama ┼č├Âyle ├žal─▒┼č─▒r:

  1. Ba─člama, ├žal─▒┼čt─▒r─▒labilecek bir fonksiyon ├Ârne─či d├Ând├╝r├╝r
  2. ─░lk parametre ' this '
  3. ─░kinci parametre, Virg├╝lle ayr─▒lm─▒┼č ba─č─▒ms─▒z de─či┼čken listesidir ( ├ça─čr─▒ gibi )

}

 function Person(name) {
    this.name = name; 
}
Person.prototype.getName = function(a,b) { 
     return this.name + " " + a + " " + b; 
}

var reader = new Person('John Smith');

reader.getName = function() {
   // Apply and Call executes the function and returns value

   // Also notice the different ways of extracting 'getName' prototype
   var baseName = Object.getPrototypeOf(this).getName.apply(this,["is a", "boy"]);
   console.log("Apply: " + baseName);

   var baseName = Object.getPrototypeOf(reader).getName.call(this, "is a", "boy"); 
   console.log("Call: " + baseName);

   // Bind returns function which can be invoked
   var baseName = Person.prototype.getName.bind(this, "is a", "boy"); 
   console.log("Bind: " + baseName());
}

reader.getName();
/* Output
Apply: John Smith is a boy
Call: John Smith is a boy
Bind: John Smith is a boy
*/
 

25







'ValueForThis' arg├╝man─▒n─▒n kullan─▒ld─▒─č─▒ bir ├Ârnek g├Âstermek istiyorum:

 Array.prototype.push = function(element) {
   /*
   Native code*, that uses 'this'       
   this.put(element);
   */
}
var array = [];
array.push(1);
array.push.apply(array,[2,3]);
Array.prototype.push.apply(array,[4,5]);
array.push.call(array,6,7);
Array.prototype.push.call(array,8,9);
//[1, 2, 3, 4, 5, 6, 7, 8, 9] 
 

** detaylar: http://es5.github.io/#x15.4.4.7 *


23


2013-07-05





Call (), virg├╝lle ayr─▒lm─▒┼č ba─č─▒ms─▒z de─či┼čkenleri al─▒r, ├Ârne─čin:

.call(scope, arg1, arg2, arg3)

ve application (), ├Ârne─čin bir arg├╝man dizisini al─▒r:

.apply(scope, [arg1, arg2, arg3])

i┼čte birka├ž kullan─▒m ├Ârne─či daha: http://blog.i-evaluation.com/2012/08/15/javascript-call-and-apply/


20







G├Ânderen Function.prototype.apply () MDN docs :

Application () y├Ântemi, belirli bir this de─čere sahip bir i┼člevi ve bir dizi (veya bir dizi benzeri nesne) olarak sa─članan arg├╝manlar─▒ ├ža─č─▒r─▒r .

S├Âzdizimi

 fun.apply(thisArg, [argsArray])
 

G├Ânderen Function.prototype.call () MDN docs :

Call () y├Ântemi, belirli bir this de─čere sahip bir i┼člevi ve ayr─▒ ayr─▒ sa─članan arg├╝manlar─▒ ├ža─č─▒r─▒r .

S├Âzdizimi

 fun.call(thisArg[, arg1[, arg2[, ...]]])
 

G├Ânderen JavaScript Function.apply ve Function.call :

Uygulama () y├Ântemi call () ile ayn─▒d─▒r, ancak include () d─▒┼č─▒nda ikinci parametre olarak bir dizi gerektirir. Dizi, hedef metodun arg├╝manlar─▒n─▒ temsil eder.


Kod ├Ârne─či:

 var doSomething = function() {
    var arr = [];
    for(i in arguments) {
        if(typeof this[arguments[i]] !== 'undefined') {
            arr.push(this[arguments[i]]);
        }
    }
    return arr;
}

var output = function(position, obj) {
    document.body.innerHTML += '<h3>output ' + position + '</h3>' + JSON.stringify(obj) + '\n<br>\n<br><hr>';
}

output(1, doSomething(
    'one',
    'two',
    'two',
    'one'
));

output(2, doSomething.apply({one : 'Steven', two : 'Jane'}, [
    'one',
    'two',
    'two',
    'one'
]));

output(3, doSomething.call({one : 'Steven', two : 'Jane'},
    'one',
    'two',
    'two',
    'one'
)); 

Ayr─▒ca bu Fiddle'a bak─▒n─▒z .


19







Temel fark, call() bir arg├╝man listesini apply() kabul ederken , bir arg├╝man dizisini kabul etmektir .


11







─░┼čte k├╝├ž├╝k bir yaz─▒, bu ├╝zerine yazd─▒m:

http://sizeableidea.com/call-versus-apply-javascript/

 var obj1 = { which : "obj1" },
obj2 = { which : "obj2" };

function execute(arg1, arg2){
    console.log(this.which, arg1, arg2);
}

//using call
execute.call(obj1, "dan", "stanhope");
//output: obj1 dan stanhope

//using apply
execute.apply(obj2, ["dan", "stanhope"]);
//output: obj2 dan stanhope

//using old school
execute("dan", "stanhope");
//output: undefined "dan" "stanhope"
 

10


2013-12-04





Aradaki fark, call() fonksiyon ba─č─▒ms─▒z de─či┼čkenlerini ayr─▒ ayr─▒ almak ve apply() fonksiyon ba─č─▒ms─▒z de─či┼čkenlerini bir dizide almakt─▒r.


7







├ça─čr─▒y─▒ farkl─▒la┼čt─▒rabilir ve a┼ča─č─▒daki y├Ântemleri uygulayabiliriz.

ARAMA: Ba─č─▒ms─▒z de─či┼čkenli bir i┼člev ayr─▒ ayr─▒ sa─člar. ─░letilecek arg├╝manlar─▒ biliyorsan─▒z veya iletilecek bir arg├╝man yoksa, ├ža─čr─▒y─▒ kullanabilirsiniz.

UYGULAMA: Dizi olarak verilen arg├╝man ile bir fonksiyon ├ža─č─▒r─▒n. ─░┼čleve ka├ž tane arg├╝man ge├žece─čini bilmiyorsan─▒z uygulamay─▒ kullanabilirsiniz.

├ça─čr─▒da uygulama kullanman─▒n bir avantaj─▒ var, arg├╝man say─▒s─▒n─▒ de─či┼čtirmemize gerek yok, sadece ge├žen bir diziyi de─či┼čtirebiliriz.

Performansta b├╝y├╝k bir fark yoktur. Ancak bir dizinin uygulama y├Ânteminde de─čerlendirmek zorunda kalmas─▒ nedeniyle ├ža─čr─▒ya g├Âre kar┼č─▒la┼čt─▒rman─▒n biraz daha h─▒zl─▒ oldu─čunu s├Âyleyebiliriz.


6







Bunlarla y├Ântemlerin aras─▒ndaki fark, parametreleri nas─▒l ge├žirmek istedi─činizdir.

ÔÇťDizi i├žin A ve virg├╝l i├žin CÔÇŁ kullan─▒┼čl─▒ bir an─▒msat─▒c─▒d─▒r.


5







this Bir i┼člev y├╝r├╝t├╝ld├╝─č├╝nde de─čeri zorlamak i├žin hem ├ža─čr─▒ hem de uygulama kullan─▒l─▒r . Tek fark, 1'in ve oldu─ču gibi arg├╝manlar─▒ call al─▒r . sadece iki arg├╝man al─▒r, bir di─čeri arg├╝man dizisidir. n+1 this 'n' arguments apply this

Ben g├Ârd├╝─č├╝n├╝z avantaj apply ├╝zerinde call kolayca zorluk ├žekmeden di─čer i┼čleve bir i┼člev ├ža─čr─▒s─▒ temsilci olmas─▒d─▒r;

 function sayHello() {
  console.log(this, arguments);
}

function hello() {
  sayHello.apply(this, arguments);
}

var obj = {name: 'my name'}
hello.call(obj, 'some', 'arguments');
 

Biz delege nas─▒l kolayca g├Âzlemleyin hello i├žin sayHello kullanarak apply , fakat call bunu ba┼čarmak i├žin ├žok zordur.


5







Olsa call ve apply ayn─▒ ┼čeyi ba┼čarmak, seni kullanamazs─▒n─▒z tek bir yerde en az oldu─čunu d├╝┼č├╝n├╝yorum call ama sadece kullanabilirsiniz apply . Miras─▒ desteklemek ve yap─▒c─▒y─▒ ├ža─č─▒rmak istedi─činiz zamand─▒r.

─░┼čte bir i┼člev, di─čer s─▒n─▒flar─▒ geni┼čleterek de s─▒n─▒f olu┼čturmay─▒ destekleyen s─▒n─▒flar olu┼čturman─▒za olanak sa─člar.

 function makeClass( properties ) {
    var ctor = properties['constructor'] || function(){}
    var Super = properties['extends'];
    var Class = function () {
                 // Here 'call' cannot work, only 'apply' can!!!
                 if(Super)
                    Super.apply(this,arguments);  
                 ctor.apply(this,arguments);
                }
     if(Super){
        Class.prototype = Object.create( Super.prototype );
        Class.prototype.constructor = Class;
     }
     Object.keys(properties).forEach( function(prop) {
           if(prop!=='constructor' && prop!=='extends')
            Class.prototype[prop] = properties[prop];
     });
   return Class; 
}

//Usage
var Car = makeClass({
             constructor: function(name){
                         this.name=name;
                        },
             yourName: function() {
                     return this.name;
                   }
          });
//We have a Car class now
 var carInstance=new Car('Fiat');
carInstance.youName();// ReturnsFiat

var SuperCar = makeClass({
               constructor: function(ignore,power){
                     this.power=power;
                  },
               extends:Car,
               yourPower: function() {
                    return this.power;
                  }
              });
//We have a SuperCar class now, which is subclass of Car
var superCar=new SuperCar('BMW xy',2.6);
superCar.yourName();//Returns BMW xy
superCar.yourPower();// Returns 2.6
 

4







Temel fark, ├ža─čr─▒ kullanarak, kapsam─▒ de─či┼čtirebilir ve arg├╝manlar─▒ normal olarak iletebiliriz, ancak uygula arg├╝manlar─▒ Dizi olarak ├ža─č─▒rman─▒z─▒ sa─člar (bunlar─▒ bir dizi olarak iletir). Ancak kodunuzda ne yapacaklar─▒ konusunda olduk├ža benzerler.

Bu i┼člevin s├Âzdizimi, application () ile neredeyse ayn─▒ olsa da, temel fark, call () 'in bir arg├╝man listesini kabul etmesini sa─člarken, application () tek bir arg├╝man dizisini kabul etmesidir.

G├Ârd├╝─č├╝n├╝z gibi, b├╝y├╝k bir fark yok, ancak yine de call () veya application () kullanmay─▒ tercih etti─čimiz durumlar var. ├ľrne─čin, MDN'den bir dizideki en k├╝├ž├╝k ve en b├╝y├╝k say─▒y─▒ bulan a┼ča─č─▒daki uygulama koduna bak─▒n:

 // min/max number in an array
var numbers = [5, 6, 2, 3, 7];

// using Math.min/Math.max apply
var max = Math.max.apply(null, numbers); 
// This about equal to Math.max(numbers[0], ...)
// or Math.max(5, 6, ...)

var min = Math.min.apply(null, numbers)
 

├ľyleyse temel fark, tart─▒┼čmalar─▒ ge├žme ┼čeklimiz:

Ara:

 function.call(thisArg, arg1, arg2, ...);
 

Uygulamak:

 function.apply(thisArg, [argsArray]);
 

4







├ľzet:

Hem call() ve apply() bulunan y├Ântemlerdir Function.prototype . Bu nedenle prototip zinciri arac─▒l─▒─č─▒yla her fonksiyon nesnesinde bulunurlar. Her ikisi de call() ve apply() belirtilen de─čeri olan bir i┼člevi ├žal─▒┼čt─▒rabilir this .

Aras─▒ndaki temel fark call() ve apply() bunu i├žine arg├╝manlar ge├žmek zorunda yoludur. ─░kisinde de call() ve apply() bir ilk arg├╝man olarak siz de─čer olmas─▒n─▒ istedi─činiz nesneyi ge├žmesi this . Di─čer arg├╝manlar ┼ču ┼čekilde farkl─▒l─▒k g├Âsterir:

  • ─░le call() normalde arg├╝manlar koymak zorunda (ikinci arg├╝man ba┼člayarak)
  • Sizinle apply() arg├╝manlar dizisine ge├žmek zorundas─▒n─▒z.

├ľrnek:

 let obj = {
  val1: 5,
  val2: 10
}

const summation = function (val3, val4) {
  return  this.val1 + this.val2 + val3 + val4;
}

console.log(summation.apply(obj, [2 ,3]));
// first we assign we value of this in the first arg
// with apply we have to pass in an array


console.log(summation.call(obj, 2, 3));
// with call we can pass in each arg individually 

Neden bu i┼člevleri kullanmam gerekiyor?

this De─čer javascript zor bazen olabilir. Bir i┼člev tan─▒mland─▒─č─▒nda de─čil, bir i┼člev y├╝r├╝t├╝ld├╝─č├╝nde this belirlenen de─čer . E─čer fonksiyonumuz do─čru this ba─člamaya ba─čl─▒ysa, bu davran─▒┼č─▒ uygulamak call() ve apply() uygulamak i├žin kullanabiliriz . ├ľrne─čin:

 var name = 'unwantedGlobalName';

const obj =  {
  name: 'Willem',
  sayName () { console.log(this.name);}
}


let copiedMethod = obj.sayName;
// we store the function in the copiedmethod variable



copiedMethod();
// this is now window, unwantedGlobalName gets logged

copiedMethod.call(obj);
// we enforce this to be obj, Willem gets logged 


3







Buna biraz detay ekleyeyim.

bu iki ├ža─čr─▒ neredeyse e┼čde─čerdir:

 func.call(context, ...args); // pass an array as list with spread operator

func.apply(context, args);   // is same as using apply
 

Sadece k├╝├ž├╝k bir fark var:

  • spread Operat├Âr ... ge├žen sa─člar iterable args aramaya liste olarak.
  • apply Sadece kabul dizi benzeri ba─č─▒ms─▒z de─či┼čken.

Yani bu ├ža─čr─▒lar birbirini tamaml─▒yor. Biz bekliyoruz Nerede iterable , call biz bekliyoruz i┼čleri, dizi benzeri , apply eserlerini.

Ve her ikisi de nesneler i├žin iterable ve dizi benzeri , ger├žek dizi gibi, biz teknik olarak bunlardan herhangi verebilirdim ama uygulamak muhtemelen olacak daha h─▒zl─▒ en JavaScript motorlar─▒ dahili olarak daha iyi optimize ├ž├╝nk├╝.


0



─░lgili yay─▒nlar


Spring Framework'de @Inject ve @Outowired aras─▒ndaki fark nedir? Hangisi hangi ko┼čulda kullan─▒lacak?

Payla┼č─▒lan Tercih'teki commit () ile uygulama () aras─▒ndaki fark nedir

Typeof ve instanceof aras─▒ndaki fark nedir ve biri di─čerine ne zaman kullan─▒lmal─▒d─▒r?

Map ve flatMap ve her biri i├žin iyi bir kullan─▒m durumu aras─▒ndaki fark nedir?

Javac ve Eclipse derleyicisi aras─▒ndaki fark nedir?

Read () ve recv () ile ve G├Ânderen () ve write () Aras─▒ndaki Fark Nedir?

Yineleyici ile yinelenebilir aras─▒ndaki fark nedir ve nas─▒l kullan─▒l─▒r?

Tek Y├Ânl├╝ ve ├çift Y├Ânl├╝ JPA ve Hibernate dernekleri aras─▒ndaki fark nedir?

ÔÇťAfter_createÔÇŁ ve ÔÇťafter_saveÔÇŁ ile ne zaman kullan─▒laca─č─▒ aras─▒ndaki fark nedir?

C++ STL'deki const_iterator ve const olmayan yineleyici aras─▒ndaki fark nedir?

Etiketle ilgili di─čer sorular [javascript]


Nas─▒l java.lang.UnsupportedClassVersionError d├╝zeltmek: Desteklenmeyen major.minor s├╝r├╝m├╝

DataTable'daki LINQ sorgusu

Python kullanarak bir dosyay─▒ HTTP ├╝zerinden nas─▒l indirebilirim?

Kesin takma kural nedir?

__Pycache__ nedir?

├çal─▒┼čt─▒─č─▒m Python beti─činin yolunu nas─▒l bulabilirim? [├žift]

bash: pip: komut bulunamad─▒

├ľzel API anahtarlar─▒n─▒ uygulamalarda saklamak ve korumak i├žin en iyi y├Ântem [kapal─▒]

Collectors.toMap'ta Java 8 NullPointerException

Tf.placeholder ve tf.Variable aras─▒ndaki fark nedir?