일반적으로 두 호출의 결과는 동일하지만 여전히 차이점이 있습니다.
첫 번째 방법:
function a( ) {
alert('old');
var b=a
function a(){
b()
alert('new'); 🎜 >}
a();//브라우저에서 메모리 오버플로가 발생합니다
두 번째 방법:
function a(){
alert('old')
}
var b=a; >var a=function(){
b();
alert('new');
}
a();//브라우저는 'old'를 순서대로 경고하고 'new'를 경고합니다. '
여기서 두 방식의 차이는 확연히 구분됩니다. 정의 순서가 다릅니다.
첫 번째는 a 함수가 처음에 재정의되지 않고 그 안에서 실행된다는 점입니다.
두 번째 방법은 a = function() 함수에서 실행되지 않는 코드 a를 재정의한 것입니다. 따라서 여기서의 재정의는 유효합니다.
보충 1:
alert('old');
var b=a
function a(){
b(); (' new');
}
컴파일 시: 먼저 a는 Alert("old")로 정의되고 그 다음에는 b();alert("new")로 정의됩니다. ;
런타임: b = function a(){b();alert("new");}, 이때 b는 a와 동일하며 b는 함수 본문에서 직접 호출되며 결과는 다음과 같습니다. a에서 호출하든 b에서 호출하든 동일합니다.
반면에
코드를 복사합니다
var b=a
var a=function(){
b();
alert('new') ;
}
컴파일 시간: a는 Alert("old")로 정의됩니다.
실행 시간: b=function a (){alert("old")}; a= function(){b();alert("new")}; 이때 b의 함수 본문에는 ab가 포함되지 않으며 a는 b만 호출합니다. ... 어떠한 경우에도 스택 오버플로가 발생하지 않습니다...
보충 2:
일반적으로 첫 번째 작성 방법은 코드 오염을 피하기 위해 사용되지만 원래 기능을 유지해야 하는 경우에는 반드시 두 번째 작성 방법을 사용하십시오. 어쨌든 두 방법 모두 w3c를 준수합니다.
사실 첫 번째 글쓰기 방식은 나중에 나왔고, 이 글쓰기 방식이 최적화되었습니다.