그들 사이에 차이점이 있나요?
개발 과정에서 불필요한 창을 추가하는 사람은 거의 없는 것 같습니다. 예를 들어 Ajax 프로세스의 콜백 함수는 JSON 형식 문자열
코드 복사를 구문 분석합니다. 코드는 다음과 같습니다.
..
함수 콜백(str){
var json = eval('(' str ')')
}
...
보통 var json = window.eval('(' str ')')이 아닌 직접 eval을 사용합니다.
예를 들어 디버깅할 때 경고를 사용하고, window.alert 이벤트를 사용하는 사람은 거의 없습니다. IE에서 이벤트 객체를 얻으며 window.event를 사용하는 사람은 거의 없습니다. (Firefox도 이벤트를 지원하지만 window.event는 지원하지 않는 경우도 있습니다. 관심 있는 학생은 이 글을 읽고 이벤트 객체를 얻을 수 있습니다.)
그러나 각 엔진 구현의 차이로 인해 여전히 차이점이 있습니다. . 의.
var x = 5; fn() {
var x = 'jack';
eval('x=10;')
fn()
alert(x); >5
모든 브라우저의 출력은 5입니다. 이는 fn을 호출한 후 eval이 전역 x가 아닌 fn의 로컬 변수 x를 수정한다는 의미입니다. 즉, eval에 의해 실행되는 클로저 환경은 fn 내에 있습니다.
위 코드의 eval을 window.eval로 수정하고 교체한 결과, 테스트 결과 브라우저마다 성능이 다른 것을 확인했습니다.
IE6/7/8: 여전히 5를 출력합니다. 즉, 전역 변수 x는 수정되지 않았지만 지역 변수 x는 여전히 수정되었습니다.
IE9/Firefox/Safari/Chrome/Opera: 출력 10, 전역 변수 x가 수정되었습니다.
결론을 내릴 수 있습니다
IE6/7/8에서 eval은 window.eval과 동일합니다. 사용자 정의 함수로 작성하면 로컬 클로저이고, 그렇지 않으면 전역 클로저입니다.
IE9/Firefox/Safari/Chrome/Opera에서 eval은 위의 IE6/7/8과 동일합니다. window.eval을 커스텀 함수로 작성하더라도 전역 클로저입니다.
또한 IE의 window.execScript는 항상 전역 폐쇄 하에서 실행되며 놀랍게도 Chrome도 이 방법을 지원합니다. 아, 크롬 정책은 기본이고 IE도 빠질 수 없죠.