2015-08-24 14 views
5

Function.prototype.call, bu modu değiştirir; niye ya? Katı modda

var example = function() { 
    console.log(typeof this); 
    return this; 
}; 
: Aksi example.call('test') # prints 'string'

, example.call('test') # prints 'object'

Ancak (beklediğiniz gibi) console.log(example.call('test')) baskılar test

Neden Function.call değişiklik typeof 'test' === 'string'examplethis bağlı gelir?

+2

' 'diyoruz geçirilen this değerini zorlamak yok (Function.prototype.apply ve Function.prototype.call kullanılarak yapılan aramalar dahil) işlev çağrısı vasıtasıyla geçirilen
this değer. Bu "değeri" bir nesneyi (burada, bir "String" nesnesi) zorlayan özensiz moddur. – Bergi

cevap

5

call() kullanarak ve ilkel bir değere this argüman ayarlayarak, o ilkel değeri her zaman bir nesneye dönüştürülür, bu yüzden ilkel dize

String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ... 

call() belgeleri üzerinde yerine dize nesnesini almak edilir MDN devletler

thisArg
oİşlev çağrısı için this değeri sağlandı.
Bu yöntemin gördüğü gerçek değer olmayabilir: yöntem, sıkı olmayan mod kodunda bir işlevse null ve undefined, genel nesnesi ile değiştirilecek ve ilkel değerler nesnelere dönüştürülecektir.

kadar sigara katı modda temel dize değeri this ise, bu da
ECMA standard, Annex C

katı mod kısıtlama belirtilmiş ve özel durumlar, bir nesnenin dönüştürülür Sıkı mod kodu içinde değerlendirildiğinde, this değeri, bir nesneye zorlanmamış değeridir.
null veya undefined'un bu değeri, genel nesneye dönüştürülmez ve ilkel değerler sarmalayıcı nesnelerine dönüştürülmez. şey değiştiren bir nesne O değil

+0

Gönderinizden değil, "kutulu" bir eleştiri mi? İnsanlar neden daha tutarlı "bir nesneyi zorlamak" dediğinde, insanlar gereksiz yere jargonun gereksiz yere tanıtmasına neden sebep oluyor? – RobG

+0

@RobG - Kim bilir, "kutulu" kullanan MDN'den doğrudan kopyalayıp yapıştırır, bu yüzden bu terimi kullanmaya devam ettim. – adeneo

+1

Artık "kutulu" demiyor. ;-) – RobG

İlgili konular