2010-01-18 4 views
3

WebKit 기반 브라우저에서 네이티브 코드 함수를 JavaScript 개체로 사용할 수 없습니다. 이러한 함수의 별칭을 직접 지정할 수 있습니까?WebKit에서 네이티브 코드 함수를 JavaScript 개체로 사용

이 예에 의해 설명하는 가장 쉬운, 그래서 여기에 내가 개발자 도구 콘솔에서 실행하고 무엇을 : 나는 Safari에서 jQuery Lint를 사용하려고로

console.warn; 
// Outputs: 
// function warn() { 
//  [native code] 
// } 

console.warn("console.warn"); 
// Outputs: "console.warn" 

var _c = console; 
_c.warn("_c.warn"); 
// Outputs: "_c.warn" 

var _w = console.warn; 
_w("_w"); 
// Outputs: "TypeError: Type error" on Safari/WebKit (Mac) 
// Outputs: "TypeError: Illegal invocation" on Chrome (Mac) 

var _w2 = function() { console.warn.apply(console, arguments); } 
_w2("_w2"); 
// Outputs: "w2" 

이 문제가왔다;

if((jQuery.browser.safari || jQuery.browser.webkit) && window.console) { 
    jQuery.LINT.level = 3; 
    jQuery.LINT.console = { 
     warn: function() { console.warn.apply(console, arguments); }, 
     group: function() { console.group.apply(console, arguments); }, 
     groupEnd: function() { console.groupEnd(); }, 
     groupCollapsed: function() { console.group.apply(console, arguments); }, 
     log: function() { console.log.apply(console, arguments); } 
    } 
} 

답변

7

개의 메소드는 JavaScript, 네이티브 또는 아님, WebKit에 별칭을 지정할 수 없습니다.

var _w = console.warn;라고 말하면 warn을 소유자 객체 console에서 제거하고 독립 실행 형 함수로 처리합니다. 전화를 걸면 console에 대한 참조가 this이 아니므로 작동하지 않습니다.

당신은 다른 언어로 작동하는 방법 바인딩 된 메서드에서이 특이한 찾을 수 있습니다,하지만 자바 스크립트 메서드 호출이 설계되어 단지 방법은 다음 this 참조가 ownerowner.method() (또는 owner['method']())에 무엇만을 기준으로 함수에 전달됩니다. 함수가 소유자없이 단독으로 호출 된 경우 thiswindow 개체로 설정되며이 메서드는 대부분 넘어집니다.

method.bind(owner) 인 ECMAScript 5 판에,이 문제를 해결 얻고 적절한 this 전달, 당신도 method.call (또는 method.apply)을 사용해야합니다 명시 적으로 @slebetman에 의해 설명 된 바와 같이, 또는 var _w= function() { console.warn.apply(console, arguments) }; 같은 폐쇄를 사용하여 자신의 바인딩 기능을 만들거나하려면 .

+0

이상하게도 새로운 버전의 Firebug는 여러분이'console'의 메소드에 별명을 붙이면 괜찮습니다. – James

+0

글쎄, 조금 거짓말. :-) 물론 그것은 구현에 달려있다; 자연스럽게 'this'가 무엇인지 신경 쓰지 않고 콜백 할 수있는 함수를 만드는 것이 가능합니다.이 경우 변수에 앨리어싱을 적용하면 ... 의존할만한 것이 아니지만. (또한 브라우저가 제공하는 비 기본 '호스트 객체'의 경우 모든 베팅이 해제됩니다.) – bobince

2

이되어야한다 :

console.warn.apply(console,arguments); 

첫 번째 매개 변수에

_console = { 
    warn: window.console && console.warn || function(){}, 
    ... 
} 

_console.warn("some error"); 

여기 내 임시 해결 방법입니다 : window.console가 존재하지 않는 경우 파손을 방지하기 위해 다음과 같은 방법을 사용 적용 의 값은 warn 방법으로 전달됩니다.

+0

감사합니다. 이 문제를 해결하기 위해 질문을 업데이트했습니다. 필자가 겪었던 대부분의 쟁점들을 해결했지만, WebKit의 네이티브 함수에 대해 좋은 정보를 가지고 있는지 여부를 조금 더 자세히 보류하겠습니다. – PCheese

관련 문제