2015-03-18 25 views
7

sayısız yerlerde desen bu tür vardır bazı kod üzerinden geldim:this.someFunction.call'ın amacı nedir (bu, param);

this.someFunction.call(this, param); 

ama bana desen bazen içinde görünen

this.someFunction(param) 

yazarak sadece daha ayrıntılı bir yol görünüyor geri arama olarak sağlanan bir işlev. İlgili olması durumunda Backbone kullanılacaktır. Böyle bir şey:

Backbone.View.extend({ 
    // other stuff ... 

    someFunction: function(param) { 
     // ... 
    }, 
    anotherFunction: function() { 
     this.collection.on("some_event", function() { 
      this.someFunction.call(this, param); 
     }); 
    } 
}); 

desen aslında this.someFunction(param) eşdeğer değilse veya kapatma doğru this yakalayan hakkında değil sadece sinir birisi oldu bir etkisi var mıdır? Herhangi bir yorumlara için

teşekkürler!

+3

* "kapatılması doğru yakalayan hakkında değil sadece sinir veya bir insanı' this'" *' this' fonksiyonları içinde özel bir değerdir ve kapsam etkilenmez. (istisna: ES6 ok fonksiyonları). Burada normal işlev çağrısı üzerinden '.call' tercih etmek için bir neden göremiyorum. –

+0

Her ikisi de muhtemelen bir çeşit kodlama kuralıyla eşdeğerdir. Komut dosyaları da sık sık gizleniyor. – kidwon

+0

çağrı() kullanarak bazı ek yük ekler ve özellikle döngülerde belirgin olan yürütmeyi yavaşlatır. Bu kod aslında, çağndan _this_ 'i kilitleyen 'this.collection.on (" some_event ", this.someFunction.bind (this, param)) olarak yazılabilir. omurga, _this_ nasıl kullanıldığına bağlı olarak, o anda doğru _this_'a sahip olmak için, anotherFunction() içindeki bağlı değeri çoğaltmanız gerekebilir. – dandavis

cevap

2

alacak?

Hayır, gerçekten aynıdır. this.someFunction'un .call'u Function.prototype'dan devraldığı bir işlev olduğunu varsayarsak (ancak bu nitrit çekicidir). Birisi overcautious gibi

görünüyor, ya da kod iki defa this kullanmıyordu şeyin bir kalıntısıdır. Ya da yazar, this-context-in-callbacks issue'un farkındaydı ancak doğru şekilde işleyemedi.

1

Ben herhangi bir nedenler sağlanan kod işlev çağrısı böyle bir yol kullanmak görmüyorum. Burada (eğer argümanlarla hiçbir değişiklik gerekiyorsa) böyle doğrudan işlev çağrısını kullanın

this.collection.on("some_event", this.someFunction, this); 

veya

this.collection.on("some_event", function() { 
    this.someFunction(//some modified args) 
}, this); 

Ve bana .call doğru kullanımının örnek teşkil izin vermek daha iyidir. Tabii u've bu görülme: arguments gibi

Array.prototype.slice.call(arguments, 2); 

, biz arguments ile çalışmak üzere Dizi yöntemini 'ödünç' olabilir bir dizi değil. Üzerinde slice aramaya çalışacağız olursa arguments Eğer desen aslında this.someFunction(param) eşdeğer olmayan bir etkiye sahip mi bir hata