2016-09-14 5 views
33

나는 항상 console.log을 콜백 매개 변수로 일부 함수에 전달하려고 할 때 bind() 메서드를 사용하여 console을 바인딩하지 않으면 작동하지 않는다는 것을 기억합니다. 예를 들어console.log()는 콘솔이 아닌 다른 객체에서 호출 됨

:

const callWithTest = callback => callback('test'); 
callWithTest(console.log); // That didn't use to work. 
callWithTest(console.log.bind(console)); // That worked (and works) fine. 

Uncaught TypeError: Illegal invocation in javascript를 참조하십시오.

그러나 최근에 콘솔 외의 다른 개체에서 호출 할 때도 console.log()이 잘 작동하는 것으로 나타났습니다. 예 :

console.log.call(null, 'test'); 

logs 'test'

언제 그리고 왜 변경 되었습니까? 사양에서 그것에 대해 아무 말도하지 않습니까?

로깅 API를 그들 모두는 등 콜백, foreach는 방법을 처리

이 더 이상 포함되어 에러 없음 인수로 전달 될 수 있도록 호출 기능이 있어야한다 :

+1

Btw, 오페라 (오래된 것)는 연령대가 있기 때문에 ... – Bergi

답변

0

언제 변경했는지 모르겠지만 왜 작동하지 않는지에 대한 아이디어가 있습니다.

다음 코드를 고려

callWithTest = callback => callback('test'); 
var Demo = function() {this.str = 'demo';} 
Demo.prototype.getStr = function() { return this.str;} 
demo = new Demo(); 
demo.getStr(); // returns 'demo' 
callWithTest(demo.getStr); // returns undefined 
window.str = 'window'; 
callWithTest(demo.getStr); // returns 'window' 

코드를 추적하면, 그것을 당신이 demo.getStr가 다른 함수를 호출 될 때, thiswindow을 말한다 것을 볼 수 있습니다, 그리고 사인 strwindow 내에서 정의되지 않은 undefined을 반환합니다. 직접 호출했거나 데모로 바인딩 한 경우 this이 데모를 참조하므로 '데모'가 반환됩니다.

nodeJS (v6.6.0)에는 콘솔 모듈 내에 Console이라는 클래스가 있으며,이 클래스는 로그를 파일 (또는 사용자가 원하는 모든 스트림)로 명시 적으로 파이프 할 수 있습니다. 그것은 필요가 없기 때문에

console = new Console(process.stdout, process.stderr); 

Console

브라우저에 존재하지 않는, Node.js를 V6.6.0 API를 사양에 따라. 콘솔의 출력은 디버깅에 사용되는 캔버스에만 존재하며 정확히 하나의 인스턴스가 있습니다. 사용자는 심각한 보안 문제가 될 수 있으므로 콘솔 출력을 다른 곳으로 파이프 할 수 없으며 그렇게해서는 안됩니다. 이 때문에 개발자는 정확히 하나의 콘솔 개체 인스턴스가 있기 때문에 var x = this.x || console.x과 같은 로그 함수 내에서 작업을 수행 할 수 있습니다.

+0

'Console'은 파이어 폭스에 존재합니다. 또한 사용자는 console.log() 함수를 단순히 덮어 씀으로써 콘솔 출력을 파이프 할 수 있습니다 (Stack Snippets의 가상 콘솔 작동 방식). –

+0

콘솔 교체.다른 기능을 가진 로그는 파이핑이 아닙니다. 콘솔 출력을 파일로 파이프 할 수 있다면 클라이언트 PC에 실행 파일을 빌드 할 수 있습니다. nodeJS에서 모든 메시지를 하나 또는 여러 파일로 리디렉션하려는 경우 런타임에 콘솔 오브젝트를 다시 작성할 수 있습니다. –