전통적인 개념에서, JavaScript 함수는 참조 통과 (포인터 통과라고도 함)를 통과하는 것으로 여겨지며, 일부 사람들은 가치 통과 및 참조 통과를 모두 사용할 수 있다고 생각합니다. 그렇다면 JS 매개 변수가 통과하면 어떻게됩니까? 실제로 다음 데모는 Java에서 사용할 수 있습니다.
먼저, 더 간단한 기본 유형의 배송을 받으십시오.
함수 추가 (num) {num+= 10; return num;} num = 10; alert (add (num)); aelrt (num); // 출력 20,10JS의 공식 설명에 따르면, 출력 20과 10의 경우, 기본 유형 매개 변수가 전달 될 때 복사 작업이 수행되므로 외부 선언 된 변수 NUM과 함수 매개 변수는 정확히 동일한 값을 가지지 만 완전히 다른 매개 변수 주소를 갖습니다. 아무도 서로를 모르고 함수 호출이 반환 될 때 함수 매개 변수 Num 스택 프레임이 나타납니다. 따라서 함수 매개 변수를 변경하면 원래 외부 변수에 영향을 미치지 않습니다.
보다 복잡한 객체 참조 유형 패스를 살펴 보겠습니다.
함수 setName (obj) {obj.name = "ted";} var obj = new Object (); setName (obj); alert (obj.name); // output ted위의 코드의 본질은 다음과 같습니다. 객체 객체를 만들고, OBJ에 참조 할당 (C에서는 메모리 주소의 직접 할당)을 할당 한 다음 기능 매개 변수를 전달할 때 이전 메소드와 동일한 작업을 수행하고 기능 매개 변수의 OBJ에 스택 프레임을 복사했으며, 동일한 값을 가질 때 (대상을 변경할 수 있음), 값을 변경할 수 있습니다. Java), 변경이 완료된 후에는 함수 매개 변수 OBJ에 해당하는 스택 프레임도 팝업해야합니다.
따라서 해당 출력은 변경 후 객체 객체의 값입니다.
그러면 일부 친구들은 물어볼 수 있습니다. 이것은 참조 패스 (포인터 패스)로 이해 될 수 있습니까? 아니, 엄밀히 말하면, Java와 비슷한 언어로는 포인터가 없습니다. Java에서 상기 과정을 기호 참조에서 직접 참조에 이르기까지 구문 분석 프로세스라고합니다. C에서 포인터는 고정 된 길이 (대부분의 C 컴파일러에서 2 바이트)를 가진 유형이지만, 유사한 언어에서는 참조에는 고유 한 속성과 방법이 있지만 직접 액세스하고 제어 할 수 없으므로 어떤 의미에서도 객체입니다. 이 메커니즘은 또한 메모리 누출을 크게 피하고이 용어를 메모리 구조화 된 액세스 메커니즘이라고합니다.
위의 요점을 증명하기 위해 위의 예는 약간 수정됩니다.
함수 setName (obj) {obj.name = "ted"; obj = new Object (); obj.name = "mary";} var obj = new Object (); setName (obj); alert (obj.name); // output ted이 예제와 이전 예제의 유일한 차이점은 기능 매개 변수 OBJ에 새 개체가 할당되어 함수 매개 변수 OBJ와 원래 참조 OBJ 매개 변수가 완전히 다른 값과 메모리 주소를 갖도록한다는 것입니다.
위의 기사는 JavaScript 함수 매개 변수 전달이 값 통과인지 참조 전달이 내가 공유 한 모든 컨텐츠인지에 대해 간단히 이야기합니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.