Uncaught TypeError: (ค่ากลาง) (…) ไม่ใช่ฟังก์ชัน


129

ทุกอย่างทำงานได้ดีเมื่อฉันเขียนตรรกะ js ในการปิดเป็นไฟล์ js เดียวดังนี้:

(function(win){
   //main logic here
   win.expose1 = ....
   win.expose2 = ....
})(window)

แต่เมื่อฉันพยายามแทรกฟังก์ชันทางเลือกการบันทึกก่อนการปิดนั้นในไฟล์ js เดียวกัน

 window.Glog = function(msg){
     console.log(msg)
 }
 // this was added before the main closure.

 (function(win){
   //the former closure that contains the main javascript logic;
 })(window)

มันบ่นว่ามี TypeError:

Uncaught TypeError: (intermediate value)(...) is not a function

ฉันทำอะไรผิด?

คำตอบ:


276

ข้อผิดพลาดเป็นผลมาจากเครื่องหมายอัฒภาคที่ขาดหายไปในบรรทัดที่สาม:

window.Glog = function(msg) {
  console.log(msg);
}; // <--- Add this semicolon

(function(win) {
  // ...
})(window);

ข้อกำหนด ECMAScript มีกฎเฉพาะสำหรับการแทรกอัฒภาคอัตโนมัติอย่างไรก็ตามในกรณีนี้จะไม่มีการแทรกอัฒภาคโดยอัตโนมัติเนื่องจากนิพจน์วงเล็บที่ขึ้นต้นในบรรทัดถัดไปสามารถตีความเป็นรายการอาร์กิวเมนต์สำหรับการเรียกฟังก์ชันได้

ซึ่งหมายความว่าหากไม่มีเครื่องหมายอัฒภาคนั้นwindow.Glogฟังก์ชันที่ไม่ระบุตัวตนจะถูกเรียกใช้โดยมีฟังก์ชันเป็นmsgพารามิเตอร์ตามมาด้วย(window)ความพยายามที่จะเรียกสิ่งที่ส่งคืนในภายหลัง

นี่คือวิธีตีความรหัส:

window.Glog = function(msg) {
  console.log(msg);
}(function(win) {
  // ...
})(window);

4
@armnotstrong Josh เร็วกว่าและคำตอบก็เหมือนกัน :)
mrlew

1
ขอบคุณครับ! ตัวอักษรของฉันลบอัฒภาคโดยอัตโนมัติและทุกอย่างก็พัง :)
Jonas Lomholdt

1
ที่น่ากลัว !!! ขอบคุณมาก!! ผมร่วงเกือบหมดแล้ว ...
TMS

1
นี่เพื่อนของฉันเป็นทองคำ!
LihO

1
มันบ้ามากและฉันรู้สึกขอบคุณมากสำหรับโพสต์นี้ ฉันกำลังตั้งค่าสถานะหลังจากifคำสั่งในuseEffect()ฟังก์ชันReact เมื่อฉันยังคงได้รับข้อผิดพลาด "... ไม่ใช่ฟังก์ชัน"
Rahul Nath

7

เพื่อให้กฎอัฒภาคเป็นเรื่องง่าย

ทุกบรรทัดที่ขึ้นต้นด้วย a (, [`หรือโอเปอเรเตอร์ (/, +, - เป็นบรรทัดเดียวที่ถูกต้อง) ต้องขึ้นต้นด้วยอัฒภาค

func()
;[0].concat(myarr).forEach(func)
;(myarr).forEach(func)
;`hello`.forEach(func)
;/hello/.exec(str)
;+0
;-0

ซึ่งจะป้องกันไม่ให้ไฟล์

func()[0].concat(myarr).forEach(func)(myarr).forEach(func)`hello`.forEach(func)/hello/.forEach(func)+0-0

monstrocity

หมายเหตุเพิ่มเติม

หากต้องการพูดถึงสิ่งที่จะเกิดขึ้น: วงเล็บจะทำดัชนีวงเล็บจะถือว่าเป็นพารามิเตอร์ของฟังก์ชัน backtick จะเปลี่ยนเป็นเทมเพลตที่ติดแท็กและ regex หรือจำนวนเต็มที่ลงนามอย่างชัดเจนจะเปลี่ยนเป็นตัวดำเนินการ แน่นอนคุณสามารถเพิ่มเครื่องหมายอัฒภาคต่อท้ายทุกบรรทัดได้ เป็นเรื่องดีที่จะจำไว้ว่าเมื่อคุณสร้างต้นแบบอย่างรวดเร็วและกำลังวางอัฒภาคของคุณ

นอกจากนี้การเพิ่มเครื่องหมายอัฒภาคที่ท้ายทุกบรรทัดจะไม่ช่วยคุณในสิ่งต่อไปนี้ดังนั้นโปรดจำไว้ว่าข้อความเช่น

return // Will automatically insert semicolon, and return undefined.
    (1+2);
i // Adds a semicolon
   ++ // But, if you really intended i++ here, your codebase needs help.

กรณีข้างต้นจะเกิดขึ้นเพื่อย้อนกลับ / ดำเนินการต่อ / ทำลาย / ++ / - ตัวพิมพ์ใด ๆ จะจับสิ่งนี้ด้วยรหัสตายหรือ ++ / - ข้อผิดพลาดทางไวยากรณ์ (++ / - จะไม่เกิดขึ้นจริง)

สุดท้ายหากคุณต้องการให้การต่อไฟล์ทำงานได้ตรวจสอบให้แน่ใจว่าแต่ละไฟล์ลงท้ายด้วยอัฒภาค หากคุณใช้โปรแกรมบันเดิลเลอร์ (แนะนำ) ควรดำเนินการนี้โดยอัตโนมัติ


5

กรณีข้อผิดพลาด:

var userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;

เอาท์พุท:

TypeError: (intermediate value)(intermediate value) is not a function

แก้ไข:คุณไม่มีเครื่องหมายอัฒภาค (;) เพื่อแยกนิพจน์

userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}; // Without a semi colon, the error is produced

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;

3

สำหรับฉันมันง่ายกว่ามาก แต่ฉันต้องใช้เวลาสักพักกว่าจะคิดออก โดยทั่วไปเรามีอยู่ใน. jslib

some_array.forEach(item => {
    do_stuff(item);
});

ปรากฎว่า Unity (emscripten?) ไม่ชอบไวยากรณ์นั้น เราแทนที่มันด้วย for-loop แบบเก่าและมันก็หยุดบ่นทันที ฉันเกลียดมากที่มันไม่ได้แสดงแนวที่มันบ่น แต่อย่างไรก็ตามหลอกฉันสองครั้งทำให้ฉันอับอาย


ฉันเดาว่าปัญหาของคุณเกี่ยวข้องกับเรื่องนี้
Brandito

นี่เป็นกรณีที่แตกต่างจากคำถามเกี่ยวกับ
CherryDT

@CherryDT ไม่ได้เนื่องจากข้อผิดพลาดที่ฉันได้รับนั้นเป็นข้อผิดพลาดเดียวกัน
tfrascaroli

ไม่คำถามนี้เกี่ยวกับข้อผิดพลาดที่คุณได้รับจากการเรียกสิ่งที่เป็นฟังก์ชันโดยไม่ได้ตั้งใจเนื่องจากไม่มีอัฒภาคระหว่างคำสั่งและ(ในบรรทัดถัดไป ฉันไม่เห็นสิ่งนั้นในกรณีของคุณ คำถามไม่เพียง แต่ประกอบด้วยชื่อเรื่องเท่านั้น!
CherryDT

1

ฉันประสบปัญหานี้เมื่อฉันสร้างคลาส ES2015 ใหม่โดยที่ชื่อคุณสมบัติเท่ากับชื่อเมธอด

เช่น:

class Test{
  constructor () {
    this.test = 'test'
  }

  test (test) {
    this.test = test
  }
}

let t = new Test()
t.test('new Test')

โปรดทราบว่าการใช้งานนี้อยู่ใน NodeJS 6.10

เป็นวิธีแก้ปัญหาชั่วคราว (หากคุณไม่ต้องการใช้ชื่อเมธอด 'setTest' ที่น่าเบื่อ) คุณสามารถใช้คำนำหน้าสำหรับคุณสมบัติ "ส่วนตัว" ของคุณได้ (เช่น_test)

เปิดเครื่องมือสำหรับนักพัฒนาในjsfiddle


นี่เป็นกรณีที่แตกต่างจากคำถามเกี่ยวกับ
CherryDT

0
  **Error Case:**

var handler = function(parameters) {
  console.log(parameters);
}

(function() {     //IIFE
 // some code
})();

เอาต์พุต: TypeError: (ค่ากลาง) (ค่ากลาง) ไม่ใช่ฟังก์ชัน * วิธีแก้ไขไอที -> เนื่องจากคุณไม่มี semi colan (;) เพื่อแยกนิพจน์

 **Fixed**


var handler = function(parameters) {
  console.log(parameters);
}; // <--- Add this semicolon(if you miss that semi colan .. 
   //error will occurs )

(function() {     //IIFE
 // some code
})();

ทำไมถึงเกิดข้อผิดพลาด ?? เหตุผล: กฎเฉพาะสำหรับการแทรกอัฒภาคอัตโนมัติซึ่งได้รับมาตรฐาน ES6


0

เมื่อฉันสร้างคลาสรูทซึ่งมีวิธีการที่ฉันกำหนดโดยใช้ฟังก์ชันลูกศร เมื่อสืบทอดและเขียนทับฟังก์ชันเดิมฉันสังเกตเห็นปัญหาเดียวกัน

class C {
  x = () => 1; 
 };
 
class CC extends C {
  x = (foo) =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));

สิ่งนี้แก้ไขได้โดยการกำหนดวิธีการของคลาสพาเรนต์โดยไม่มีฟังก์ชันลูกศร

class C {
  x() { 
    return 1; 
  }; 
 };
 
class CC extends C {
  x = foo =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.