TypeError: console.log (…) ไม่ใช่ฟังก์ชัน


104

ฉันสับสนจริงๆว่าฉันจะรับ 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

คำตอบ:


214

วิธีการแก้

เพียงใส่อัฒภาค ( ;) หลังconsole.log().


คำอธิบาย

ข้อผิดพลาดสามารถทำซ้ำได้ง่ายเช่นนี้:

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

มันพยายามที่จะผ่านfunction(){}เป็นอาร์กิวเมนต์ที่ค่าตอบแทนของconsole.log()ที่ตัวเองไม่ได้เป็นฟังก์ชั่น แต่จริงๆแล้วundefined(ตรวจสอบtypeof console.log();) เพราะนี่คือ JavaScript console.log()(function(){})ตีความว่านี่เป็น console.logแต่เป็นฟังก์ชัน

หากคุณไม่มีconsoleวัตถุที่คุณเห็น

ReferenceError: คอนโซลไม่ได้กำหนดไว้

หากคุณมีconsoleวัตถุ แต่ไม่ใช่logวิธีการที่คุณเห็น

TypeError: console.log ไม่ใช่ฟังก์ชัน

สิ่งที่คุณมีคือ

TypeError: console.log (... ) ไม่ใช่ฟังก์ชัน

สังเกต(...)หลังชื่อฟังก์ชัน ด้วยสิ่งเหล่านี้หมายถึงค่าส่งคืนของฟังก์ชัน

แบ่งสายไม่ได้แยกทั้งสองสำนวนที่เป็นงบเพราะ JavaScript ของกฎสำหรับการแทรกอัฒภาคอัตโนมัติ (ASI)


เคารพ ;

ข้อมูลโค้ดทั้งหมดนี้ทำให้เกิดข้อผิดพลาดที่ไม่คาดคิดทุกประเภทหากไม่มีอัฒภาค:

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และการเข้าถึงสถานที่ให้บริการnullจะทำให้เกิดTypeError: string.match(...) is null - The ค่าตอบแทนnullเป็น ในกรณีของค่าตอบแทนเป็นconsole.log(...)undefined


8
ขอบคุณ. แก้ไขปัญหาได้โดยการเพิ่มเครื่องหมายอัฒภาค ช่างเป็นมุมมืดในจาวาสคริปต์
Qian Chen

4
@ElgsQianChen: เหตุผลหนึ่งที่ต้องใช้อัฒภาคเสมอ
Felix Kling

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 ไม่ใช่ฟังก์ชันที่ 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.