포착되지 않은 TypeError : (중간 값) (…)은 함수가 아닙니다.


128

클로저에 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

내가 뭘 잘못 했어?

답변:


275

이 오류는 세 번째 줄에 세미콜론이 누락 된 결과입니다.

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
감사합니다! 내 린터은 자동적으로 세미콜론을 제거하고 모든 : 파산
조나스 Lomholdt에게

1
대박!!! 정말 고맙습니다!! 나는 거의 ...이 하나에 모든 내 머리를 잃었
TMS

1
내 친구, 이건 금이야!
LihO

1
이것은 제정신이 아니며이 게시물에 대해 너무 감사합니다. 이 "... is not a function"오류가 계속 발생했을 때 ifReact useEffect()함수 의 문 다음에 상태를 설정했습니다 .
Rahul Nath

7

세미콜론 규칙을 간단하게 만들려면

로 시작할 모든 행은 (, [`또는 연산자 (/, +, - 유일하게 유효한 것들), 세미콜론 (;)으로 시작해야합니다.

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

괴물.

추가 참고 사항

무슨 일이 일어날 지 언급하자면 : 괄호는 색인이되고 괄호는 함수 매개 변수로 취급됩니다. 백틱은 태그지정된 템플릿 으로 변환되고 정규식 또는 명시 적으로 서명 된 정수는 연산자로 바뀝니다. 물론 모든 줄 끝에 세미콜론을 추가 할 수 있습니다. 빠르게 프로토 타이핑하고 세미콜론을 떨어 뜨릴 때 염두에 두는 것이 좋습니다.

또한 모든 줄 끝에 세미콜론을 추가하는 것은 다음과 같은 작업에 도움이되지 않으므로 다음과 같은 문장을 명심하십시오.

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.

위의 경우는 return / continue / break / ++ /-발생합니다. 모든 linter는 데드 코드 또는 ++ /-구문 오류로 이것을 포착합니다 (++ /-는 현실적으로 발생하지 않습니다).

마지막으로, 파일 연결이 작동하도록하려면 각 파일이 세미콜론으로 끝나는 지 확인하십시오. 번 들러 프로그램 (권장)을 사용하는 경우이 작업이 자동으로 수행됩니다.


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'메서드 이름을 사용하지 않으려는 경우) 'private'속성 (예 :)에 접두사를 사용할 수 있습니다 _test.

jsfiddle 에서 개발자 도구를 엽니 다 .


이것은 질문의 내용과는 다른 경우입니다.
CherryDT

0
  **Error Case:**

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

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

Output : TypeError : (intermediate value) (intermediate value) is not a function * How to Fix IT-> because you are missing semi colan (;) to separate expressions;

 **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.