웹 프론트엔드 JS 튜토리얼 JavaScript의 함수 호출에 대한 코드 세부정보

JavaScript의 함수 호출에 대한 코드 세부정보

Mar 23, 2017 pm 02:26 PM

많은 분들이 JavaScript를 배우시는 과정에서 함수 매개변수 전달 방식에 대해 헷갈려하셨을 텐데요. JavaScript에 대한 지식, 관심 있는 친구들, 함께 배워보세요

정의

많은 사람들이 학습 과정에서 함수 매개 변수를 접했을 수도 있습니다. Javascript 전송 방법에 대해 혼란스러워서 심층 분석의 정신으로 소스 코드에서 몇 가지 답을 찾고 싶습니다. 그러나 이를 수행하기 전에 먼저 몇 가지 개념을 명확히 해야 합니다. 값 전달, 참조 전달 등 고유의 이름을 버리고 영어로 돌아갑니다.

call by reference && call by value && call by shared

C++에서 참조 전달과 값 전달로 이해되는 것입니다. 세 번째는 더 혼란스럽습니다. 공식적인 설명은 객체에 대한 참조 사본을 받는다는 것입니다. 일반인의 관점에서 설명하겠습니다.

객체는 의 집합으로 이해될 수 있습니다. 객체는 키가 가리키는 데이터를 참조합니다(포인터인지 여부는 다루지 않겠습니다). 구현 또는 C++ 참조 구현) 함수가 수신하는 것은 변수 의 복사본입니다. 이 변수는 개체에 대한 참조를 포함하며 값으로 전달됩니다.

그렇다면 함수 매개변수를 전달할 때 받는 객체 유형 매개변수는 실제로 실제 매개변수의 복사본이므로 유형 매개변수의 포인터를 직접 변경하는 것은 불가능하다는 것이 분명합니다. ; 객체 자체 때문에 키는 모두 참조이므로 키 포인터를 수정하는 것이 가능합니다.

증명

몇 가지 간단한 코드로 이를 증명할 수 있습니다

코드 1: 함수는 가리키는 데이터를 수정할 수 있습니다. to by key

let func = obj => { obj.name = 'Dosk' };
let obj = {name : 'Alxw'};
console.log(obj); //{ name: 'Alxw' }
func(obj)
console.log(obj); //{ name: 'Dosk' }
로그인 후 복사

코드 2: 함수는 obj를 수정할 수 없습니다

let func = obj => { obj = {} };
let obj = {name : 'Alxw'};
console.log(obj); //{ name: 'Alxw' }
func(obj)
console.log(obj); //{ name: 'Alxw' }
로그인 후 복사

코드 3: 내부 obj와 외부 === 결과는 동일합니다

let def = {name : 'Alxw'};
let func = obj => { console.log(obj === def) };
func(def); //true
로그인 후 복사

그래서 다음이 있을 수 있습니다. 세 번째 코드 부분에 문제가 있습니다. obj는 def의 복사본인데 왜 === 연산이 여전히 true일 수 있습니까? === 연산이 Object에 대한 메모리의 주소를 비교한다는 뜻이 아닌가요? 복사본이라면 false여야 합니까?

이제 Google V8의 소스 코드로 돌아가서 살펴보겠습니다.

Google V8 심층 분석

소스 코드에서 정확히 동일한 연산 코드 부분을 살펴보겠습니다.

bool Object::StrictEquals(Object* that) {
 if (this->IsNumber()) {
  if (!that->IsNumber()) return false;
  return NumberEquals(this, that);
 } else if (this->IsString()) {
  if (!that->IsString()) return false;
  return String::cast(this)->Equals(String::cast(that));
 } else if (this->IsSimd128Value()) {
  if (!that->IsSimd128Value()) return false;
  return Simd128Value::cast(this)->Equals(Simd128Value::cast(that));
 }
 return this == that;
}
로그인 후 복사

다음과 같아야 합니다. 마지막 경우 이론적으로 def와 obj가 다른 객체라면 false를 반환해야 합니다. 위의 내용을 뒤집는 것이 아닌가요? 실제로는 한 가지가 무시됩니다. 즉, 객체를 내부적으로 인스턴스화할 때 Google V8 자체는 동적 인스턴스화이며, 컴파일된 언어에서 동적 인스턴스화는 힙 메모리에서만 수행될 수 있다는 것을 알고 있습니다. 사용됩니다. 이 결론을 증명하려면 Local, Handle 및 기타 class를 구현하는 것이 너무 번거롭다고 생각합니다. 🎜> 소스 코드 검색 이 호출되는 모든 곳은 주소 연산을 거치지 않고 직접 전달됩니다. Object::StrictEquals

그러나 어떤 사람들은 값으로 전달된 변수에 Object에 대한 참조가 포함되어 있으므로 이론적으로 Object를 수정하는 것이 가능하다고 질문할 수 있습니다. 왜 세 번째 코드는 수정할 수 없나요?

이유는 매우 간단합니다. 왜냐하면 소위 Javascript 언어의 논리적 수준에서 우리가 수행하는 작업은 단지 Google V8의 인스턴스 메서드를 호출하는 것일 뿐 현 시점에서는 작업이 불가능하기 때문입니다(물론 잠재적인 버그가 발생할 수 있음). -. -)

재정의

여기에 공유하면 호출을 다시 설명할 수 있을 것 같습니다.

실제로 값으로 전달되지만 내용에는 Object의 포인터가 포함되어 있으며 이 포인터는 여러 변수에 의해 공유됩니다.

또 다른 간단한 증명

자, 소스코드를 보세요

V8_DEPRECATE_SOON("Use maybe version",
         Local<Value> Call(Local<Value> recv, int argc,
                  Local<Value> argv[]));
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Call(Local<Context> context,
                       Local<Value> recv, int argc,
                       Local<Value> argv[]);
로그인 후 복사
위 내용은 곧 폐기될 예정입니다

인터페이스, 제가 본 코드의 이 버전에는 더 이상 사용되지 않을 예정인 코드가 많이 포함되어 있습니다. 한번 살펴보세요. 초점은 함수의 유일한 호출 인터페이스인 두 번째 인터페이스에 있습니다. 내부는 결국 C++의 비트 복사를 호출하므로 값으로 전달된다는 것을 쉽게 증명할 수 있습니다. Local<Value>

이 핵심일지도 모릅니다

잊지 마세요. 우리가 정의하는 변수는 모두

형식이므로 객체는 객체 간에 공유됩니다. Javascript에서 변수라고 부르는 것은 객체의 인스턴스를 직접 참조하지 않습니다!!!Handle<Object>

마지막 항목

간단히 말하면 이해하기 어려울 수도 있고 심지어 오류가 있을 수도 있지만, 자바스크립트 언어 수준에서 그 특징을 파악할 수 있다는 것이 중요합니다.

위 내용은 편집자가 소개한 Javascript의 함수 호출입니다. 궁금한 점이 있으면 메시지를 남겨주시면 편집자가 시간에 맞춰 답변해 드리겠습니다. . 또한 Script House 웹사이트를 지원해 주시는 모든 분들께 감사의 말씀을 전하고 싶습니다!

위 내용은 JavaScript의 함수 호출에 대한 코드 세부정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 Dec 17, 2023 pm 02:54 PM

WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 WebSocket 및 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 Dec 17, 2023 pm 05:30 PM

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 Dec 17, 2023 pm 12:09 PM

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

C++ 함수 호출 성능 조정: 매개변수 전달 및 반환 값의 영향 C++ 함수 호출 성능 조정: 매개변수 전달 및 반환 값의 영향 May 04, 2024 pm 12:57 PM

C++ 함수 호출 성능 최적화에는 매개변수 전달 전략과 반환 값 유형 최적화라는 두 가지 측면이 포함됩니다. 매개변수 전달 측면에서 작은 객체와 수정 불가능한 매개변수에는 값 전달이 적합하고, 큰 객체와 수정 가능한 매개변수에는 참조나 포인터 전달이 적합하며 포인터 전달이 가장 빠릅니다. 반환값 최적화 측면에서 작은 값은 직접 반환할 수 있고, 큰 객체는 참조나 포인터를 반환해야 합니다. 적절한 전략을 선택하면 함수 호출 성능이 향상될 수 있습니다.

JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 JavaScript와 WebSocket: 효율적인 실시간 일기예보 시스템 구축 Dec 17, 2023 pm 05:13 PM

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

C++의 다른 모듈에서 함수를 호출하는 방법은 무엇입니까? C++의 다른 모듈에서 함수를 호출하는 방법은 무엇입니까? Apr 12, 2024 pm 03:54 PM

C++에서 모듈 전체에 걸쳐 함수 호출: 함수 선언: 대상 모듈의 헤더 파일에서 호출할 함수를 선언합니다. 함수 구현: 소스 파일에 함수를 구현합니다. 모듈 연결: 링커를 사용하여 함수 선언과 구현이 포함된 모듈을 서로 연결합니다. 함수 호출: 호출하려는 모듈에 대상 모듈의 헤더 파일을 포함시킨 후 함수를 호출합니다.

간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 간단한 JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법 Jan 05, 2024 pm 06:08 PM

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

C++ 함수 호출 반영 기술: 매개변수 전달 및 반환 값의 동적 액세스 C++ 함수 호출 반영 기술: 매개변수 전달 및 반환 값의 동적 액세스 May 05, 2024 am 09:48 AM

C++ 함수 호출 리플렉션 기술을 사용하면 런타임 시 함수 매개변수 및 반환 값 정보를 동적으로 얻을 수 있습니다. 매개변수 및 반환 값 유형 정보를 얻으려면 typeid(decltype(...)) 및 decltype(...) 표현식을 사용하십시오. 리플렉션을 통해 동적으로 함수를 호출하고 런타임 입력을 기반으로 특정 함수를 선택할 수 있으므로 유연하고 확장 가능한 코드가 가능해집니다.

See all articles