TypeError: कंसोल.लॉग (…) एक फ़ंक्शन नहीं है


97

मैं वास्तव में उलझन में हूं कि मैं कैसे सांत्वना पा सकता हूं। लाइन 1091 पर एक फ़ंक्शन नहीं है। अगर मैं नीचे बंद को हटा देता हूं, तो लाइन 1091 ऐसी त्रुटि की शिकायत नहीं करता है। क्रोम संस्करण 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);
            }
        }
    }
};

क्षमा करें चित्र बहुत छोटा होने के लिए आकार बदला हुआ प्रतीत होता है। मैं यह पता लगाने की कोशिश कर रहा हूं कि इसे मूल आकार कैसे दिखाया जाए।
कियान चेन

2
कृपया अपने कोड और त्रुटियों को दिखाने के लिए चित्रों का उपयोग न करें, यह बुरा अभ्यास है।
ब्लूबेरग्यू

जवाबों:


202

उपाय

बस … के ;बाद एक अर्धविराम ( ) लगाएं ।console.log()


व्याख्या

त्रुटि इस तरह आसानी से प्रतिलिपि प्रस्तुत करने योग्य है:

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

यह रिटर्न मान के function(){}तर्क के रूप में पारित करने की कोशिश कर रहा है , जो स्वयं एक फ़ंक्शन नहीं है, लेकिन वास्तव में (चेक ) है। इसका कारण यह है कि जावास्क्रिप्ट इस की व्याख्या करता है । तथापि है एक समारोह।console.log()undefinedtypeof console.log();console.log()(function(){})console.log

यदि आपके पास वह consoleवस्तु नहीं है जो आप देखेंगे

संदर्भ: कंसोल को परिभाषित नहीं किया गया है

यदि आपके पास consoleवस्तु थी लेकिन वह logविधि नहीं जो आप देखेंगे

TypeError: कंसोल.लॉग एक फ़ंक्शन नहीं है

हालाँकि आपके पास क्या है

TypeError: कंसोल.लॉग (...) एक फ़ंक्शन नहीं है

(...)फ़ंक्शन नाम के बाद नोट करें। उन लोगों के साथ यह फ़ंक्शन के रिटर्न मान का जिक्र कर रहा है।

स्वचालित अर्धविराम सम्मिलन (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]

अगर वह रेगुलर एक्सप्रेशन से नहीं मिला है, विधि वापस आ जाएगी nullऔर पर संपत्ति एक्सेसर nullएक कारण होगा TypeError: string.match(...) is null - वापसी मान है null। के मामले में वापसी मान था ।console.log(...)undefined


8
धन्यवाद। अर्धविराम जोड़कर समस्या हल की गई। जावास्क्रिप्ट में एक अंधेरा कोना।
कियान चेन

4
@ एल्सक्यूशियनचेन: हमेशा अर्धविराम का उपयोग करने का एक कारण।
फेलिक्स क्लिंग

2
ऐसा इसलिए है क्योंकि console.log()()इसके console.log(...)3 डॉट्स एक फंक्शन एरर नहीं हैं, अन्यथा यह सिर्फ console.logफंक्शन नहीं होना चाहिए (केवल अगर यह नहीं था लेकिन वास्तव में यह है)
विनायक

2
@vinayakj बिल्कुल। यदि किसी चीज़ का कोई फ़ंक्शन नहीं है, तो वह फ़ंक्शन हमेशा उसके फ़ंक्शन नाम से संदर्भित होता है, उदाहरण के लिए object.method, यदि आप रिटर्न वैल्यू का उपयोग कर रहे हैं, विशेष रूप से एक जंजीर विधि में, तो यह होगा object.method(...)। यह पता करने के लिए अनुभव लेता है कि आपको हमेशा अर्धविराम का उपयोग क्यों करना चाहिए, और जावास्क्रिप्ट त्रुटि संदेशों की सही व्याख्या कैसे करें।
user4642212

2
इस तरह के मुद्दों की वजह से इसे कभी-कभी अर्धविराम वाले IIFEs के लिए उपसर्ग करने की सलाह दी जाती है। इस तरह से अगर आप इसे इधर-उधर ले जाते हैं तो यह एक लापता अर्धविराम को कहीं और तोड़ने का जोखिम नहीं उठाएगा। इसके अतिरिक्त यदि चीजें मिनिमाइजेशन / बंडलिंग के दौरान अजीब हो जाती हैं तो यह अधिक सुरक्षित होगा।
मैरी

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 काम करता है, ऐसा क्यों हो रहा है? मैं इसे कैसे ठीक करूं और शान्ति का उपयोग करूँ।
गुटिन

1

इस त्रुटि का सामना करने का एक और तरीका है। console.logअपरिवर्तनीय नहीं है और गलती से मूल्य को अधिलेखित करना संभव है।

console.log = 'hi';

इस मामले में नुकसान को पूर्ववत करने के लिए बस पृष्ठ को फिर से लोड करें।


-1

मुझे पता है कि यह "द" उत्तर नहीं है, लेकिन मुझे लगा कि मैं निम्नलिखित में टॉस करूंगा

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

मेरे पास उस पृष्ठ पर एक टेक्स्टारिया था जिसे मैं " कंसोल " कह रहा था । अचानक मेरे सभी कंसोल.लॉग () स्क्रिप्ट्स ने त्रुटि दी "अनकैप्ड टाइपर्रर: कंसोल.लॉग एक समारोह में वस्तु नहीं है"

... और ठीक है इसलिए, क्योंकि मैंने अपनी वस्तु / var के लिए एक आरक्षित नाम स्थान का उपयोग किया है। मुझे एहसास हुआ कि मैंने उनके पोस्ट को पढ़ने के बाद क्या किया था, और बाद के लिए: दोहरे नामकरण सम्मेलनों की जांच करें।

चियर्स

"इसकी हमेशा मानवीय भूल"


-1

कम से कम प्रतिक्रिया-मूल में, कंसोल बिना किसी आयात के काम करने लगता है, इसलिए, मेरी फ़ाइल की शुरुआत से इसे हटाने import console = require('console');या import console from 'console';मेरे लिए इसे ठीक कर दिया। (वीएस कोड आईडीई लगता है कि स्वचालित रूप से कभी कभी जोड़ने के लिए)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.