클로저에 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
내가 뭘 잘못 했어?
답변
이 오류는 세 번째 줄에 세미콜론이 누락 된 결과입니다.
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);
답변
세미콜론 규칙을 간단하게 만들려면
로 시작할 모든 행은 (
, [
`또는 연산자 (/, +, – 유일하게 유효한 것들), 세미콜론 (;)으로 시작해야합니다.
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는 데드 코드 또는 ++ /-구문 오류로 이것을 포착합니다 (++ /-는 현실적으로 발생하지 않습니다).
마지막으로, 파일 연결이 작동하도록하려면 각 파일이 세미콜론으로 끝나는 지 확인하십시오. 번 들러 프로그램 (권장)을 사용하는 경우이 작업이 자동으로 수행됩니다.
답변
오류 사례 :
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;
답변
나에게는 훨씬 더 간단했지만 그것을 알아내는 데 시간이 걸렸습니다. 우리는 기본적으로 .jslib에
some_array.forEach(item => {
do_stuff(item);
});
Unity (emscripten?)는 그 구문을 좋아하지 않습니다. 우리는 그것을 좋은 오래된 for-loop로 바꾸었고 불평을 즉시 멈췄습니다. 나는 그것이 불평하는 대사를 보여주지 않는 것이 정말 싫다. 그러나 어쨌든, 나를 두 번 부끄럽게 속인다.
답변
속성 이름이 메서드 이름과 동일한 새 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
.
답변
**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 표준이 주어진 자동 세미콜론 삽입에 대한 특정 규칙
답변
화살표 함수를 사용하여 메서드를 정의한 루트 클래스를 만들 때. 원래 함수를 상속하고 덮어 쓸 때 동일한 문제를 발견했습니다.
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));