TypeError: console.log (…) bukanlah sebuah fungsi

108

Saya benar-benar bingung bagaimana saya bisa mendapatkan console.log bukanlah fungsi pada baris 1091. Jika saya menghapus penutupan di bawah ini, baris 1091 tidak mengeluh kesalahan seperti itu. Versi Chrome 43.0.2357.130 (64-bit).

masukkan deskripsi gambar di sini

Ini kodenya:

$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);
            }
        }
    }
};
Qian Chen
sumber
Maaf gambar tampaknya diubah ukurannya menjadi terlalu kecil. Saya mencoba mencari cara untuk membuatnya menunjukkan ukuran aslinya.
Qian Chen
3
Tolong jangan gunakan gambar untuk menunjukkan kode dan kesalahan Anda, itu praktik yang buruk.
Blubberguy22

Jawaban:

222

Larutan

Sederhananya titik koma ( ;) setelah console.log().


Penjelasan

Kesalahan mudah direproduksi seperti ini:

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

Ini berusaha untuk lulus function(){}sebagai argumen dengan nilai kembali dari console.log()yang itu sendiri bukan fungsi tetapi sebenarnya undefined(cek typeof console.log();). Ini karena JavaScript menafsirkan ini sebagai console.log()(function(){}). console.logbagaimanapun adalah sebuah fungsi.

Jika Anda tidak memiliki consoleobjek yang Anda lihat

ReferenceError: konsol tidak ditentukan

Jika Anda memiliki consoleobjek tetapi bukan logmetode yang akan Anda lihat

TypeError: console.log bukanlah sebuah fungsi

Apa yang Anda miliki, bagaimanapun, adalah

TypeError: console.log (...) bukanlah sebuah fungsi

Catat (...)setelah nama fungsi. Dengan itu, itu mengacu pada nilai kembali dari fungsi tersebut.

Jeda baris tidak memisahkan kedua ekspresi ini sebagai pernyataan terpisah karena aturan JavaScript untuk penyisipan titik koma otomatis (ASI) .


Hormati ;

Semua cuplikan kode ini menghasilkan semua jenis kesalahan tak terduga jika tidak ada titik koma:

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

Contoh lain

Anda (...)sering kali melihat penggunaan metode berantai atau pengakses properti berantai:

string.match(/someRegEx/)[0]

Jika RegEx itu tidak ditemukan, metode akan kembali nulldan pengakses properti nullakan menyebabkan TypeError: string.match(...) is null - nilai yang dikembalikan adalah null. Dalam kasus console.log(...)nilai kembali itu undefined.

Sebastian Simon
sumber
10
Terima kasih. Masalah diselesaikan dengan menambahkan titik koma. Sungguh sudut gelap di javascript.
Qian Chen
4
@ElgsQianChen: Salah satu alasan untuk selalu menggunakan titik koma.
Felix Kling
2
jadi itu karena console.log()()yang console.log(...)3 titik bukan kesalahan fungsi, selain itu harus menjadi hanya console.logtidak fungsi (hanya jika itu bukankah namun sebenarnya)
vinayakj
2
@vinayakj Tepat. Jika ada sesuatu yang bukan fungsi maka fungsi itu selalu dirujuk oleh nama fungsinya, misalnya object.method, jika Anda menggunakan nilai kembalian, terutama dalam metode berantai, itu akan menjadi object.method(...). Dibutuhkan pengalaman untuk mengetahui mengapa Anda harus selalu menggunakan titik koma, dan bagaimana menafsirkan pesan kesalahan JavaScript dengan benar.
Sebastian Simon
2
Karena masalah seperti ini, terkadang disarankan untuk selalu mengawali IIFE dengan titik koma. Dengan cara itu jika Anda memindahkannya di sekitarnya, tidak akan berisiko melanggar titik koma yang hilang di tempat lain. Selain itu jika ada yang aneh selama minifikasi / bundling, itu akan lebih aman.
Marie
6

Pembaruan 2020

Salah satu kemungkinan penyebabnya adalah deklarasi var consolesuatu tempat di skrip Anda.

Menggunakan:

window.console.log(...);

sebagai gantinya. Bekerja untuk saya.

Saya harap ini membantu

Pelajar
sumber
Saya memiliki masalah yang sama dan global.console.log berfungsi, mengapa ini terjadi? Bagaimana cara memperbaikinya dan menggunakan consol.log
Gutyn
5

Kesalahan berarti bahwa nilai kembali dari console.log()tidak fungsi. Anda kehilangan titik koma:

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

yang membuat (...)IIFE berikut ini diinterpretasikan sebagai panggilan fungsi.


Bandingkan pesan kesalahan dari

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

dan

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

Ada cara lain untuk menghadapi kesalahan ini. console.logtidak dapat diubah dan nilai dapat ditimpa secara tidak sengaja.

console.log = 'hi';

Dalam hal ini, muat ulang halaman untuk membatalkan kerusakan.

Craig Pemberton
sumber
-1

Saya tahu ini bukan jawaban "THE", tetapi saya pikir saya akan melemparkan yang berikut ini

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

Saya memiliki textarea di halaman yang saya sebut " konsol ". tiba-tiba semua skrip console.log () saya memberikan pesan kesalahan "Tidak Tertangkap TypeError: console.log bukan fungsi di Objek"

... dan memang demikian, karena saya menggunakan namespace yang dicadangkan untuk objek / var saya. Saya menyadari apa yang telah saya lakukan setelah membaca postingannya, dan demi anak cucu: periksa ulang konvensi penamaan.

Bersulang

"itu selalu kesalahan manusia"

Žagarskas Kristen
sumber
-1

Setidaknya dalam react-native, konsol tampaknya berfungsi tanpa impor apa pun, jadi, menghapus import console = require('console');atau import console from 'console';dari awal file saya memperbaikinya untuk saya. (VS Code IDE tampaknya menambahkannya secara otomatis kadang-kadang)

Top-Master
sumber