TypeError : console.log (…)는 함수가 아닙니다.


100

console.log를 얻는 방법이 정말 혼란 스럽습니다. 1091 행의 함수가 아닙니다. 아래의 클로저를 제거하면 1091 행은 이러한 오류를 표시하지 않습니다. Chrome 버전 43.0.2357.130 (64 비트).

여기에 이미지 설명 입력

다음은 코드입니다.

$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

3
코드와 오류를 보여주기 위해 사진을 사용하지 마십시오. 그것은 나쁜 습관입니다.
Blubberguy22

답변:


203

해결책

;뒤에 세미콜론 ( )을 넣으면 됩니다.console.log()


설명

오류는 다음과 같이 쉽게 재현 할 수 있습니다.

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

자체가 함수가 아니라 실제로 (check ) 반환 값function(){}인수 로 전달하려고합니다 . 이는 JavaScript가이를 . 그러나 함수.console.log()undefinedtypeof console.log();console.log()(function(){})console.log

당신이 console볼 물건이 없다면

ReferenceError : 콘솔이 정의되지 않았습니다.

당신이 가지고있는 경우 console객체가 아니라 log방법을 당신은 볼 것

TypeError : console.log는 함수가 아닙니다.

그러나 당신이 가진 것은

TypeError : console.log (...)는 함수가 아닙니다.

(...)함수 이름 뒤에 유의하십시오 . 그것들과 함께 그것은 함수의 반환 값을 나타냅니다.

자동 세미콜론 삽입 (ASI)에 대한 JavaScript의 규칙 때문에 줄 바꿈 은이 두 표현식 을 별도의 문으로 분리 하지 않습니다 .


존중 ;

세미콜론이없는 경우 이러한 모든 코드 조각은 모든 종류의 예기치 않은 오류를 발생시킵니다.

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

다른 예시

당신은 볼 (...)체인 방법이나 체인으로 연결된 속성 접근의 사용과 자주를 :

string.match(/someRegEx/)[0]

해당 RegEx를 찾을 수없는 경우 메서드가 반환 null되고 속성 접근자가 nulla를 발생 TypeError: string.match(...) is null 시킵니다. 반환 값null입니다. 의 경우 반환 값 이었다 .console.log(...)undefined


8
감사. 세미콜론을 추가하여 문제를 해결했습니다. 자바 스크립트의 어두운 구석입니다.
Qian Chen

4
@ElgsQianChen : 항상 세미콜론을 사용하는 한 가지 이유입니다.
Felix Kling 2015 년

2
때문에 그래서이다 console.log()()console.log(...)3 점없는 함수 오류가, 그렇지 않으면되어 있어야 그냥 console.log함수가 아닙니다 (가 않네 경우에만 실제로 그것이)
vinayakj가

2
@vinayakj 맞습니다. 함수가 아닌 것이 있으면 해당 함수는 항상 함수 이름으로 참조됩니다. 예를 들어 object.method반환 값을 사용하는 경우, 특히 연결 메서드에서 object.method(...). 세미콜론을 항상 사용해야하는 이유 JavaScript 오류 메시지를 올바르게 해석하는 방법을 이해 하려면 경험이 필요 합니다.
user4642212

2
이와 같은 문제 때문에 때때로 IIFE 앞에 세미콜론을 붙이는 것이 좋습니다. 이렇게하면 다른 곳에서 누락 된 세미콜론이 깨질 위험이 없습니다. 또한 축소 / 번들링 중에 문제가 발생하면 더 안전 할 것입니다.
Marie

5

오류는의 반환 값console.log()함수가 아님을 의미합니다. 세미콜론이 누락되었습니다.

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

이는 (...)IIFE 의 다음 을 함수 호출로 해석하도록합니다.


오류 메시지 비교

> 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

2020 업데이트

가능한 원인 중 하나는 다음과 같은 선언 일 수 있습니다. var console 스크립트 어딘가 .

사용하다:

window.console.log(...);

대신. 나를 위해 일했습니다.

도움이 되길 바랍니다


동일한 문제가 있고 global.console.log가 작동하는데 왜 이런 일이 발생합니까? 어떻게 수정하고 consol.log를 사용합니까
Gutyn

1

이 오류가 발생하는 다른 방법이 있습니다. console.log변경할 수 없으며 실수로 값을 덮어 쓸 수 있습니다.

console.log = 'hi';

이 경우 페이지를 새로 고침하여 손상을 취소하세요.


-1

나는 이것이 "THE"대답이 아니라는 것을 알고 있지만 다음과 같이 던질 것이라고 생각했습니다.

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

" 콘솔 " 이라고 부르는 페이지에 텍스트 영역이 있습니다. 갑자기 모든 console.log () 스크립트에서 "Uncaught TypeError : console.log is not a function at Object" 오류가 발생했습니다 .

... 그리고 당연히 내 개체 / var에 예약 된 네임 스페이스를 사용했기 때문입니다. 나는 그의 포스트를 읽은 후, 그리고 후대를 위해 내가 한 일을 깨달았다. 명명 규칙을 다시 확인했다.

건배

"항상 인간의 실수"


-1

react-native에서는 최소한 콘솔이 가져 오기없이 작동하는 것처럼 보이므로 파일을 제거 import console = require('console');하거나 import console from 'console';처음부터 수정했습니다. (VS Code IDE는 때때로 자동으로 추가하는 것 같습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.