TypeError: console.log (…) bir işlev değil


105

Console.log'u nasıl edinebileceğimi gerçekten kafam karıştı. 1091 satırında bir işlev değil. Aşağıdaki kapatmayı kaldırırsam, satır 1091 böyle bir hatadan şikayet etmez. Chrome Sürümü 43.0.2357.130 (64 bit).

görüntü açıklamasını buraya girin

İşte kod:

$scope.columnNameChanged = function (tableColumn) {
    setDirtyColumn(tableColumn);
    //propagate changes to the key fields
    for (var i = 0; i < $scope.tableIndexes.length; ++i) {
        for (var j = 0; j < $scope.tableIndexes[i].columnName.length; ++j) {
            if ($scope.tableIndexes[i].columnName[j] === tableColumn.previousName) {
                console.log('xxx', $scope.tableIndexes[i].columnName[j])
                (function (i, j) {
                    $timeout(function () {
                        console.log($scope.tableIndexes[i].columnName[j])
                        $scope.tableIndexes[i].columnName[j] = tableColumn.name.toUpperCase();
                        console.log($scope.tableIndexes[i].columnName[j])
                    });
                })(i, j);
            }
        }
    }
};

Maalesef resim çok küçük olacak şekilde yeniden boyutlandırılmış. Orijinal boyutunu nasıl göstereceğimi anlamaya çalışıyorum.
Qian Chen

3
Lütfen kodunuzu ve hatalarınızı göstermek için resim kullanmayın, bu kötü bir uygulamadır.
Blubberguy22

Yanıtlar:


217

Çözüm

… ' Den ;sonra noktalı virgül ( ) koyun .console.log()


Açıklama

Hata şu şekilde kolayca tekrarlanabilir:

console.log()
(function(){})

Geçmeye çalışıyor function(){}argüman olarak dönüş değeri arasında console.log()kendisi bir işlev olmadığı ama aslında undefined(çek typeof console.log();). Bunun nedeni JavaScript'in bunu olarak yorumlamasıdır console.log()(function(){}). console.logBununla birlikte olan bir işlev.

Eğer olmasaydı consolenesneyi görmek istiyorum

ReferenceError: konsol tanımlanmadı

consoleNesneye sahipseniz ancak loggöreceğiniz yöntem yoksa

TypeError: console.log bir işlev değil

Bununla birlikte, sahip olduğunuz şey

TypeError: console.log (...) bir işlev değil

Not (...)fonksiyon adından sonra. Bunlarla, fonksiyonun dönüş değerine atıfta bulunuyor.

Satır sonu , JavaScript'in otomatik noktalı virgül ekleme (ASI) kuralları nedeniyle bu iki ifadeyi ayrı ifadeler olarak ayırmaz .


Saygı duy ;

Noktalı virgül yoksa tüm bu kod parçacıkları her türlü beklenmedik hataya neden olur:

console.log() // As covered before
() // TypeError: console.log(...) is not a function
console.log() // Accessing property 0 of property 1 of the return value…
[1][0] // TypeError: console.log(...) is undefined
console.log() // Like undefined-3
-3 // NaN
let a, b;
const array = Array.from({ length: 2 })

// Now, let’s use destructuring:
[a, b] = array; // ReferenceError: can't access lexical declaration 'array' before initialization
let a, b;
const array = Array.from({ length: 2 }).fill(1),
  array2 = Array.from({ length: 2 })

// Now, let’s use destructuring. Attempt to get the two 1’s from `array` as `a` and `b`:
[a, b] = array;
console.log(a, b); // undefined undefined

Başka bir örnek

(...)Zincirleme yöntemlerin veya zincirleme özellik erişimcilerinin kullanımıyla çoğu zaman görürsünüz :

string.match(/someRegEx/)[0]

Bu RegEx bulunmazsa, yöntem döndürür nullve mülkiyet erişimci nullbir neden olacaktır TypeError: string.match(...) is null - dönüş değeri olduğunu null. Durumunda dönüş değeri oldu .console.log(...)undefined


8
Teşekkürler. Noktalı virgül eklenerek sorun çözüldü. Javascript'te ne karanlık bir köşe.
Qian Chen

4
@ElgsQianChen: Her zaman noktalı virgül kullanmanın bir nedeni.
Felix Kling

2
Çünkü öyle olduğunu console.log()()onun console.log(...)3 nokta değil bir işlev hatası, aksi takdirde olmuş gerektiği console.logişlev değildir (değildi yalnızca ama aslında öyle)
vinayakj

2
@vinayakj Kesinlikle. Bir şey bir işlev değilse, o işleve her zaman işlev adıyla başvurulur, örneğin object.method, özellikle zincirleme yöntemde dönüş değerini kullanıyorsanız, öyle olacaktır object.method(...). Neden her zaman noktalı virgül kullanmanız gerektiğini ve JavaScript hata mesajlarının nasıl doğru şekilde yorumlanacağını bilmek deneyim gerektirir .
user4642212

2
Bu gibi sorunlar nedeniyle bazen IIFE'lerin önüne noktalı virgül koymak önerilir. Bu şekilde, eğer onu hareket ettirirseniz, başka bir yerde eksik bir noktalı virgülü kırma riskini almazsınız. Ek olarak, küçültme / paketleme sırasında işler tuhaflaşırsa daha güvenli olur.
Marie

6

2020 Güncellemesi

Olası nedenlerden biri var console, komut dosyanızın bir yerinin beyanı olabilir .

Kullanım:

window.console.log(...);

yerine. Benim için çalıştı.

Umut ediyorum bu yardım eder


Bende de aynı sorun var ve global.console.log çalışıyor, bu neden oluyor? Nasıl düzeltebilirim ve consol.log'u kullanırım
Gutyn

5

Hata demektir dönüş değeri arasında console.log()bir fonksiyonu değildir. Bir noktalı virgül eksik:

console.log('xxx', $scope.tableIndexes[i].columnName[j]);
//                                                      ^

bu (...), IIFE'nin aşağıdakilerin bir işlev çağrısı olarak yorumlanmasını sağlar.


Hata mesajlarını karşılaştırın

> var foo = {bar: undefined};
> foo.bar();
Uncaught TypeError: foo.bar is not a function

ve

> var foo = {bar: function(){}};
> foo.bar()();
Uncaught TypeError: foo.bar(...) is not a function

1

Bu hatayla karşılaşmanın başka bir yolu var. console.logdeğişmez değildir ve yanlışlıkla değerin üzerine yazmak mümkündür.

console.log = 'hi';

Bu durumda hasarı gidermek için sayfayı yeniden yükleyin.


-1

Bunun "THE" cevabı olmadığını biliyorum, ancak aşağıdakileri yapacağımı düşündüm

 var console = $( data.message_target );
 console.val( console.val() + data.message); 
 console.scrollTop(console[0].scrollHeight - console.height());

" Konsol " dediğim sayfada bir metin alanım vardı . aniden tüm console.log () komut dosyalarım "Yakalanmamış TypeError: console.log Nesnede bir işlev değil" hatasını verdi

... ve haklı olarak, çünkü object / var için ayrılmış bir ad alanı kullandım. Yazısını okuduktan sonra ne yaptığımı fark ettim ve gelecek kuşaklar için: adlandırma kurallarını iki kez kontrol et.

şerefe

"her zaman insan hatasıdır"


-1

En azından react-native olarak, konsol herhangi bir içe aktarım olmadan çalışıyor gibi görünüyor, bu yüzden, dosyamın kaldırılması import console = require('console');veya import console from 'console';başından itibaren benim için düzeltildi. (VS Code IDE bazen bunu otomatik olarak ekler gibi görünüyor)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.