2017-02-25 1 views
0

함수 선언이 있습니다. 위의 함수 선언은 아무런 효과가 없다, 즉,이 오류가 발생하지 않아야하고 a();가 경고 창을 열해서는 안자바에서 전역 함수 선언을 재정의합니다.

function a(){alert("Hello");} 

내가 스크립트를 가지고 싶습니다은 전에 위의 스크립트를 를 실행합니다. 이

var a = function(){ alert("Hello");}; 

같은 변수 할당 내가

Object.defineProperty(window, 'a', {value: function(){}}); 

을 할 수 있었다면

은 그래서 A는 쓸 수 없습니다 그 효과가 없습니다 후 발생하는 과제.

그러나 함수 선언에서는 동일한 문제가 발생할 수 있습니다. 아무리 쓰기/구성 설정 방법, 새로운 함수 선언은 적용되지 않는다거나 defineProperty 핸들러가 있기 때문에,

Uncaught SyntaxError: Identifier 'a' has already been declared (Chrome) 
TypeError: cannot declare global binding `a': property must be configurable or both writable and enumerable (Firefox) 

ES6 프록시 유망 보였다 같은

같은 오류를 발생하지만 '프록시'에없는 것 같다 window 개체

이제 함수 선언이 브라우저 또는 ecmascript 사양에 따라 구현되는 방식 때문에이 작업을 수행 할 수 없다는 생각이 들었습니다. 이것을 달성 할 수있는 방법이 있습니까?

또는 a 함수가 선언 될 때 알림을받을 방법이 있다면 window.a = function(){}을 수행 할 수 있습니다. 그런 방법이 있습니까?

답변

1

내가이 일을 발견하는 유일한 방법 (.watch) 슬프게도, Firefox specific입니다 :

<script> 
 
function a() { console.log('no-op'); } 
 

 
window.watch('a', function (prop, oldval, newval) { 
 
    return oldval; 
 
}); 
 
</script> 
 

 
<script> 
 
function a() { alert("Hello"); } 
 
a(); 
 
</script>