>  기사  >  웹 프론트엔드  >  자바스크립트 참조 유형에 대한 간략한 소개_기본 지식

자바스크립트 참조 유형에 대한 간략한 소개_기본 지식

WBOY
WBOY원래의
2016-05-16 17:08:271305검색

소개
1. 참조 유형
참조 유형은 자바스크립트의 내부 유형입니다. 주로 변수나 함수를 대체하는 참조용으로 사용됩니다. 물론 실제 값이 필요한 경우에는 이를 통해 실제 값을 찾을 수도 있습니다.

2. 참조 유형의 구조
참조 유형의 값은 두 부분으로 구성됩니다. 하나는 참조 유형의 값이 참조하는 객체입니다. 두 번째는 기본에 있는 개체를 참조하는 개체 이름입니다. 의사 코드로 표현:

코드 복사 코드는 다음과 같습니다.

var valueOfReferenceType = {
base: ,
propertyName:
};

3. 사용 시나리오
참조 유형에는 두 가지 사용 시나리오가 있습니다.

(1)식별자를 처리하는 경우

식별자는 전역 개체의 변수 이름, 함수 이름, 함수 매개 변수 이름 및 인식할 수 없는 속성 이름입니다.

(2) 부동산 접근자를 상대할 때

코드 복사 코드는 다음과 같습니다.

var foo = 10;
function 바( ) {}

연산의 중간 결과에서 참조 유형은

에 해당합니다.

코드 복사 코드는 다음과 같습니다.

var fooReference = {
base: global,
propertyName: 'foo'
};

var barReference = {
base: global,
propertyName: 'bar'
};

여기서도 기본을 설명할 필요가 있습니다. JavaScript에서는 모든 객체나 함수가 고유한 객체를 가지고 있습니다. 이전 기사를 읽은 사람이라면 각 실행 컨텍스트에 실행 컨텍스트를 관리하는 변수 객체가 있다는 것을 알고 있을 것입니다. 또는 기능.

식별자를 다룰 때:

글로벌 맥락에서 보면 당연히 base === globalVO === gloabal

함수 실행 컨텍스트에서 기본 === VO/AO

그러나 처리 개체 속성은 다음과 같습니다.

더 간단합니다. base === owerObject

4. 참조 유형의 실제 값 가져오기
앞서 말했듯이 참조 유형은 참조일 뿐 실제 값을 저장하지는 않습니다. 실제 값이 필요한 경우 일련의 내부 알고리즘을 통해 얻을 수 있습니다. 간단한 의사 코드로 이 알고리즘을 설명할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

function GetValue(value) {

if (Type(value) != 참조) {
return value;
}

var base = GetBase(value);

if (base === null) {
새로운 ReferenceError 발생;
}

return base.[[Get]](GetPropertyName(value));

}

내부 [[Get]] 메서드는 프로토타입 체인에서 상속된 속성 분석을 포함하여 개체 속성의 실제 값을 반환합니다. 따라서 GetValue를 통해 참조 유형의 실제 값을 쉽게 얻을 수도 있습니다. 예:

코드 복사 코드는 다음과 같습니다.

GetValue(fooReference) // 10
GetValue (barReference); // 함수 개체 "bar"

그렇다면 참조 유형의 실제 값은 언제 얻어야 할까요?

일반적으로 참조 유형을 지정하거나 작업에 참여하거나 호출해야 하는 경우 GetValue 메서드를 통해 실제 값을 가져와야 합니다. (참고: GetValue를 통해 얻은 객체는 더 이상 참조 유형이 아닙니다.)

참조 유형과 이것의 관계
참조 유형은 주로 함수 맥락에서 이 점과 밀접하게 관련되어 있고, 상황에 따라 상당히 다르게 보이기 때문에 이를 함수 맥락에서 구체적으로 설명하기 위해 참조 유형을 소개합니다.

함수 컨텍스트에서 이 값을 결정하는 일반적인 규칙은 다음과 같습니다.

함수 컨텍스트에서 이는 호출자가 제공하며 함수가 호출되는 방식에 따라 결정됩니다. 호출 대괄호()의 왼쪽이 참조 유형 값인 경우 이는 참조 유형 값의 기본 개체로 설정됩니다(참조 유형과 다른 모든 속성). 이 값은 null이 됩니다. . 그러나 this 값이 null인 실제 상황은 없습니다. 왜냐하면 this 값이 null이면 해당 값이 암시적으로 전역 개체로 변환되기 때문입니다. 참고: ECMAScript 5판에서는 전역 변수로의 변환이 더 이상 강제되지 않지만 값은 정의되지 않음으로 할당됩니다.

아래에서는 호출 괄호 왼쪽의 차이에 따라 세 가지 상황에 대해 설명합니다.

(1) 호출 괄호의 왼쪽은 참조 유형의 값입니다

너무 많은 분석이 필요하지 않습니다. 기본 개체는 this 값입니다. 전역 변수 아래에 선언된 경우 전역 개체를 가리킵니다.

코드 복사 코드는 다음과 같습니다.

var myObject = {
foo : function() {
            console.log(this);
myObject.foo(); //foo의 기본이 myObject라는 것은 의심의 여지가 없으므로 foo 메서드의 이 항목은 myObject를 가리킵니다.


(2) 호출 괄호의 왼쪽은 참조형 값인데 이 값은 null입니다

코드 복사 코드는 다음과 같습니다.function myFunction() {
var foo = function (){
console.log(this);
}
foo() //AO.foo() => null.foo()
}

myFunction(); //출력: 창 {top: 창, 창: 창...}


내부 함수가 호출될 때 내부 함수의 베이스는 현재 실행 컨텍스트에서 활성 개체(OA)여야 합니다. 그러나 OA가 JavaScript 내부에서 베이스로 사용되는 경우에는 당연히 null로 처리됩니다. , JavaScript는 이것이 null이 되는 것을 허용하지 않습니다. 이 경우 base는 전역 객체로 설정됩니다(이것이 이전 this 함수 호출 패턴의 설계 오류의 원인입니다). 따라서 이 경우에는 전역 개체를 가리킵니다.

(3) 참조형이 아닌 괄호 왼쪽의 값을 호출

코드 복사 코드는 다음과 같습니다.//간단한 예시
(함수 ( ) {
console.log(this); // null => 전역
})();

// 더 복잡한 예
var foo = { bar: function () {

console.log(this);
}
};

foo.bar(); // 참조, OK => foo
(foo.bar)(); // 참조, OK => .bar)(); // 전역

(false || foo.bar)(); // 전역

(foo.bar, foo.bar)(); // 전역

호출 괄호의 왼쪽이 참조 유형이 아닌 다른 유형인 경우 자동으로 null로 설정되고 결과는 전역 객체가 됩니다.

첫 번째 예에서 직접 함수에서 함수 호출 괄호의 왼쪽은 참조가 아닌 표현식입니다.

두 번째 예는 훨씬 더 복잡합니다. 하나씩 분석해 보겠습니다.

foo.bar(), 이것에 대해서는 의심의 여지가 없습니다. 기본은 foo이고 이것은 foo를 가리킵니다.

(foo.bar)() 여기에는 그룹화 기호 역할을 하는 괄호가 사용됩니다. 즉, 참조 유형이 GetValue 메서드를 실행하도록 강제하지 않으며 실행 결과는 위와 완전히 동일합니다. .

괄호 안의 마지막 세 개는 할당 연산, OR 연산 및 쉼표 연산입니다. 이는 참조 유형이 GetValue 메서드를 실행하도록 강제하여 함수 개체를 반환합니다. 이런 식으로 함수 호출 괄호의 왼쪽은 더 이상 참조 유형이 아니므로 전역 객체를 가리킵니다.

요약

참조 유형에 관해서는 사실 잘 모르겠습니다. 방금 Tom 삼촌의 블로그에서 이 장을 보고 함수 호출 모드에서 이것의 가치 원리를 설명하기 위해 이 분석을 했습니다. 글쎄요, 저는 항상 참조 유형과 값별 참조 사이에 어떤 관계가 있어야 한다고 생각했습니다. 예기치 않게 이는 이를 이해하는 데 도움을 주기 위해 Bolg에서만 사용됩니다. 이전에도 두 사람 사이에 인연이 있었는지, 인연이 있었다면 어떤 인연이었는지는 아직 계속 연구하고 연구해야 할 것 같다.

더 많은 소통을 하시길 바랍니다. 톰아저씨께 감사의 말씀을 전하고 싶습니다.

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