TypeError: console.log (…) không phải là một hàm


100

Tôi thực sự bối rối làm thế nào tôi có thể nhận được console.log không phải là một hàm trên dòng 1091. Nếu tôi xóa phần đóng bên dưới, dòng 1091 không khiếu nại lỗi như vậy. Phiên bản Chrome 43.0.2357.130 (64-bit).

nhập mô tả hình ảnh ở đây

Đây là mã:

$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);
            }
        }
    }
};

Xin lỗi hình ảnh có vẻ được thay đổi kích thước quá nhỏ. Tôi đang cố gắng tìm cách làm cho nó hiển thị kích thước ban đầu.
Qian Chen

3
Vui lòng không sử dụng hình ảnh để hiển thị mã và lỗi của bạn, đó là một phương pháp không tốt.
Blubberguy 22

Câu trả lời:


204

Giải pháp

Đơn giản chỉ cần đặt dấu chấm phẩy ( ;) sau console.log().


Giải trình

Lỗi có thể dễ dàng lặp lại như thế này:

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

Nó đang cố gắng truyền function(){}dưới dạng một đối số cho giá trị trả về console.log()mà bản thân nó không phải là một hàm mà thực sự là undefined(kiểm tra typeof console.log();). Điều này là do JavaScript diễn giải điều này là console.log()(function(){}). console.logtuy nhiên một chức năng.

Nếu bạn không có consoleđối tượng bạn sẽ thấy

ReferenceError: console không được xác định

Nếu bạn có consoleđối tượng nhưng không có logphương thức bạn thấy

TypeError: console.log không phải là một hàm

Tuy nhiên, những gì bạn có là

TypeError: console.log (...) không phải là một hàm

Lưu ý (...)sau tên hàm. Với những cái đó, nó đề cập đến giá trị trả về của hàm.

Dấu ngắt dòng không phân tách hai biểu thức này thành các câu lệnh riêng biệt vì các quy tắc của JavaScript để chèn dấu chấm phẩy tự động (ASI) .


Tôn trọng ;

Tất cả các đoạn mã này dẫn đến tất cả các loại lỗi không mong muốn nếu không có dấu chấm phẩy:

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

Một vi dụ khac

(...)Đôi khi bạn thấy việc sử dụng các phương thức chuỗi hoặc trình truy cập thuộc tính chuỗi:

string.match(/someRegEx/)[0]

Nếu không tìm thấy RegEx đó, phương thức sẽ trả về nullvà trình truy cập thuộc tính trên nullsẽ gây ra a TypeError: string.match(...) is null - giá trị trả vềnull. Trong trường hợp của console.log(...)các giá trị trả vềundefined.


8
Cảm ơn. Sự cố được giải quyết bằng cách thêm dấu chấm phẩy. Thật là một góc tối trong javascript.
Qian Chen

4
@ElgsQianChen: Một lý do để luôn sử dụng dấu chấm phẩy.
Felix Kling

2
như vậy là vì console.log()()console.log(...)3 chấm không phải là một lỗi chức năng, nếu không nó nên được chỉ console.logkhông phải là chức năng (chỉ khi nó wasnt nhưng thực sự nó là)
vinayakj

2
@vinayakj Chính xác. Nếu một cái gì đó không phải là một hàm thì hàm đó luôn được tham chiếu đến bằng tên hàm của nó, ví dụ: object.methodnếu bạn đang sử dụng giá trị trả về, đặc biệt là trong một phương thức chuỗi, thì nó sẽ như vậy object.method(...). Bạn cần có kinh nghiệm để biết tại sao bạn nên luôn sử dụng dấu chấm phẩy cách diễn giải thông báo lỗi JavaScript một cách chính xác.
user4642212

2
Vì những vấn đề như thế này, đôi khi chúng tôi khuyên bạn nên luôn đặt tiền tố IIFE bằng dấu chấm phẩy. Bằng cách đó, nếu bạn di chuyển nó xung quanh nó sẽ không có nguy cơ phá vỡ dấu chấm phẩy bị thiếu ở nơi khác. Ngoài ra, nếu mọi thứ trở nên kỳ lạ trong quá trình thu nhỏ / đóng gói thì sẽ an toàn hơn.
Marie

5

Các lỗi có nghĩa là giá trị trả về của console.log()không phải là một hàm. Bạn đang thiếu dấu chấm phẩy:

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

điều này làm cho phần sau (...)của IIFE được hiểu là một lời gọi hàm.


So sánh các thông báo lỗi của

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

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

5

Cập nhật năm 2020

Một nguyên nhân có thể là do khai báo var consolemột nơi nào đó trong tập lệnh của bạn.

Sử dụng:

window.console.log(...);

thay thế. Đã làm cho tôi.

Tôi hy vọng nó sẽ giúp


Tôi gặp vấn đề tương tự và global.console.log hoạt động, tại sao điều này lại xảy ra? Làm thế nào để sửa chữa nó và sử dụng consol.log
Gutyn

1

Có một cách khác để gặp phải lỗi này. console.logkhông phải là bất biến và có thể vô tình ghi đè giá trị.

console.log = 'hi';

Trong trường hợp này, chỉ cần tải lại trang để hoàn tác thiệt hại.


-1

Tôi biết đây không phải là câu trả lời "THE", nhưng tôi nghĩ rằng tôi sẽ đưa ra câu trả lời sau

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

Tôi có một vùng văn bản trên trang mà tôi gọi là " bảng điều khiển ". đột nhiên tất cả các tập lệnh console.log () của tôi đều bị lỗi "Uncaught TypeError: console.log không phải là một hàm tại Object"

... và đúng như vậy, bởi vì tôi đã sử dụng một không gian tên dành riêng cho đối tượng / var của mình. Tôi nhận ra những gì tôi đã làm sau khi đọc bài đăng của anh ấy, và vì lợi ích của hậu thế: kiểm tra kỹ quy ước đặt tên.

hoan hô

"nó luôn luôn là lỗi của con người"


-1

Ít nhất trong react-native, bảng điều khiển dường như hoạt động mà không cần bất kỳ thao tác nhập nào, vì vậy, việc xóa import console = require('console');hoặc import console from 'console';từ đầu tệp của tôi đã sửa lỗi đó cho tôi. (IDE mã VS đôi khi tự động thêm vào)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.