"this" 키워드의 기능과 적절한 사용법을 이해합니다.
P粉155551728
P粉155551728 2023-10-12 15:50:58
0
2
595

"this" 키워드의 역할과 이를 올바르게 사용하는 방법에 대한 명확한 설명을 찾고 싶었습니다.

이상하게 행동하는 것 같은데 왜 그런지 전혀 이해가 되지 않습니다.

this어떻게 작동하며 언제 사용해야 하나요?

P粉155551728
P粉155551728

모든 응답(2)
P粉087951442

다른 언어와 비교하여 this 关键字在 JavaScript 中的行为有所不同。在面向对象语言中,this 关键字指的是该类的当前实例。在 JavaScript 中,this 的值由函数的调用上下文 (context.function()) 및 호출 위치가 결정됩니다. p>

1. 글로벌 맥락에서 사용될 때

글로벌 맥락에서 this 时,它会绑定到全局对象(浏览器中的window)

을 사용하는 경우 으아아아

전역 컨텍스트에 정의된 함수 내에서 this 时,this를 사용하면 함수가 실제로 전역 컨텍스트의 메서드이기 때문에 여전히 전역 개체에 바인딩됩니다. 으아아아

위의 f1是一个全局对象的方法。因此我们也可以在 window 개체에서 다음과 같이 호출하세요.

으아아아

2. 객체 메서드 내에서 사용되는 경우

객체 메소드 내에서 this 关键字时,this를 사용하면 "직접" 둘러싸는 객체에 바인딩됩니다.

으아아아

위에서 "즉시"라는 단어를 큰따옴표로 묶었습니다. 이는 객체가 다른 객체 내에 중첩된 경우 this가 직계 상위 객체에 바인딩된다는 것을 보여주기 위한 것입니다.

으아아아

객체에 명시적으로 메서드로 함수를 추가하더라도 위의 규칙을 따릅니다. 즉, this계속 상위 객체를 가리킵니다.

으아아아

3. 컨텍스트 프리 함수를 호출할 때

사용됨 this 时,它会绑定到全局对象(浏览器中的window) 컨텍스트 없이(즉, 객체가 아닌) 함수 내에서 호출할 때(함수가 객체 내부에 정의된 경우에도).

으아아아

모든 기능을 사용해 보세요

함수를 사용하여 위 사항을 시도해 볼 수도 있습니다. 그러나 여전히 몇 가지 차이점이 있습니다.

  • 위에서 객체 리터럴 표기법을 사용하여 객체에 멤버를 추가했습니다. this를 사용하여 함수에 멤버를 추가할 수 있습니다. 그들을 지정합니다.
  • 객체 리터럴 표기법은 즉시 사용할 수 있는 객체 인스턴스를 생성합니다. 함수의 경우 먼저 new 연산자를 사용하여 인스턴스를 만들어야 할 수도 있습니다.
  • 객체 리터럴 메서드에서도 점 연산자를 사용하여 정의된 객체에 멤버를 명시적으로 추가할 수 있습니다. 특정 인스턴스에만 추가됩니다. 하지만 함수의 모든 인스턴스에 반영되도록 함수 프로토타입에 변수를 추가했습니다.

아래에서는 Object와 this를 사용하여 위에서 했던 모든 작업을 시도했지만 먼저 객체를 직접 작성하는 대신 함수를 만들었습니다.

으아아아

4. 생성자 내부에서 사용되는 경우 .

함수가 생성자로 사용되는 경우(즉, new 关键字调用时),函数体内的 this 키워드를 사용하여 호출되는 경우) 함수 본문의 는 생성되는 새 객체를 가리킵니다.

으아아아 5. 프로토타입 체인에 정의된 함수 내에서 사용되는 경우

🎜

메서드가 객체의 프로토타입 체인에 있는 경우, 메소드 내의 this는 마치 해당 객체에 메소드가 정의된 것처럼 메소드가 호출되는 객체를 참조합니다.

으아악

6. 내부 호출(), 적용() 및 바인드() 함수

  • 이 모든 메소드는 Function.prototype에 정의되어 있습니다.
  • 이 메서드를 사용하면 함수를 한 번 작성하고 다른 컨텍스트에서 호출할 수 있습니다. 즉, 함수를 실행할 때 사용될 this 값을 지정할 수 있습니다. 또한 호출 시 원래 함수에 인수를 전달할 수도 있습니다.
  • fun.apply(obj1 [, argsArray])obj1 设置为 this 内的值code>fun() 并调用 fun(),传递 argsArrayfun.apply(obj1 [, argsArray])
  • obj1을 code>fun() 내의 값으로 설정하고 fun.call(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]]) - 设置 obj1 作为 fun()this 的值,并调用 fun()fun()을 호출합니다. argsArray 요소를 인수로 전달합니다.
  • fun.call(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]]) fun.bind(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]]) - 返回对函数的引用fun,其中 fun 内的 this 绑定到 obj1,并且 fun 的参数绑定到指定的参数 arg1、arg2, arg3,... - obj1 를
  • fun() 내부로 설정합니다
  • 값을 반환하고 applycallbind 之间的区别一定已经很明显了。 apply 允许将参数指定为类似数组的对象,即具有数字 length 属性和相应的非负整数属性的对象。而 call 允许直接指定函数的参数。 applycallarg1, arg2, arg3, ...
  • 을 인수로 전달하여
fun()을 호출합니다.

thisfun.bind(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])

- fun 함수에 대한 참조를 반환합니다. 여기서 fun 🎜는 🎜obj1에 바인딩되고 🎜fun의 인수는 지정된 인수 🎜arg1, arg2, arg3,...에 바인딩됩니다. 🎜 🎜이제 🎜apply, 🎜call 및 🎜bind의 차이점이 분명해졌습니다. 🎜apply를 사용하면 인수를 배열과 같은 객체(예: 숫자 🎜length 속성과 그에 대응하는 음수가 아닌 정수 속성이 있는 객체)로 지정할 수 있습니다. 그리고 🎜call을 사용하면 함수의 매개변수를 직접 지정할 수 있습니다. 🎜apply 및 🎜call 모두 지정된 컨텍스트에서 지정된 매개변수를 사용하여 즉시 함수를 호출합니다. 반면, 바인딩은 지정된 this 값과 인수에 바인딩된 함수를 반환합니다. 이 반환된 함수에 대한 참조를 변수에 할당하여 캡처할 수 있으며, 그런 다음 언제든지 호출할 수 있습니다. 🎜 🎜 으아악 🎜🎜7. 🎜🎜🎜이벤트 핸들러 내부
  • 요소의 이벤트 핸들러에 직접 함수를 할당하는 경우 이벤트 핸들러 함수 내에서 직접 this 来引用相应的元素。这种直接的函数分配可以使用 addeventListener 方法或通过 onclick와 같은 기존 이벤트 등록 방법을 사용하여 수행됩니다.
  • 마찬가지로 )内使用 this와 같이 요소의 이벤트 속성을 직접 호출하면 해당 요소를 참조합니다.
  • 단,
  • 은 이벤트 핸들러나 이벤트 속성 내에서 호출되는 다른 함수를 통해 간접적으로 사용됩니다. this 会解析为全局对象 window
  • Microsoft의 이벤트 등록 모델 접근 방식
  • 을 사용하여 이벤트 처리기에 함수를 연결하면 위와 동일한 동작을 얻을 수 있습니다. 이벤트 핸들러에 함수를 할당하는 대신(따라서 요소의 함수 메서드 생성) 이벤트에 대한 함수를 호출합니다(효과적으로 전역 컨텍스트에서 호출). attachEvent

저는 JSFiddle을 추천합니다.中更好地尝试此操作> 으아아아

8. this ES6 화살표 함수

화살표 함수에서

는 공개 변수처럼 동작합니다. 즉, 어휘 범위에서 상속됩니다. 화살표 함수를 정의하는 함수의 this 的行为类似于公共变量:它将从其词法范围继承。定义箭头函数的函数的 this 将是箭头函数的 this는 화살표 함수의

가 됩니다.

따라서 이는 다음과 동일한 동작입니다.

으아아아

아래 코드를 참조하세요: 🎜 으아아아
P粉156532706

은 실행 컨텍스트의 속성인 JavaScript의 키워드입니다. 주요 용도는 함수와 생성자입니다. this 규칙은 매우 간단합니다(모범 사례를 따르는 경우).

기술 설명this은 사양서

ECMAScript 표준definitionthis을 통한 추상 작업(약어: AO) ResolveThisBinding:

전역 환경 기록, 모듈 환경 기록, 함수 환경 기록 각각에는 고유한 GetThisBinding 메서드가 있습니다.

GetThisEnvironment AO는 현재 실행 중인 실행 컨텍스트의 LexicalEnvironment를 조회하고 this 바인딩(예: HasThisBinding이 true 을 반환함)이 있는 가장 가까운 오름차순 환경 레코드를 찾습니다([[OuterEnv]] 속성을 반복하여). . 프로세스는 세 가지 환경 레코드 유형 중 하나로 끝납니다.

this 값은 일반적으로 코드가 엄격 모드인지 여부에 따라 달라집니다.

GetThisBinding의 반환 값은 현재 실행 컨텍스트의 this 值,因此每当建立新的执行上下文时,this 값을 반영하므로 새 실행 컨텍스트가 설정될 때마다

는 다른 값으로 확인됩니다. 이는 현재 실행 컨텍스트가 수정되는 경우에도 발생할 수 있습니다. 다음 하위 섹션에는 이러한 상황이 발생할 수 있는 5가지 시나리오가 나열되어 있습니다.

코드 샘플을 AST Explorer

에 배치하여 사양 세부정보를 따를 수 있습니다.

1. 스크립트의 전역 실행 컨텍스트

이것은 최상위 수준에서 평가되는 스크립트 코드입니다(예: 内:

).

this스크립트의 초기 전역 실행 컨텍스트 내에서 를 평가하면 GetThisBinding

이 다음 단계를 수행하게 됩니다. 🎜

전역 환경 레코드의 [[GlobalThisValue]] 속성은 항상 globalThis(웹의 를 통해 액세스할 수 있는 호스트 정의 전역 개체globalThis ( Web 上的 window,Node.js 上的 global로 설정됩니다. , Node.js 글로벌 MDN 문서). InitializeHostDefinedRealm 단계에 따라 [[GlobalThisValue]] 속성이 생성되는 방법을 알아보세요.

2. module

의 전역 실행 컨텍스트

모듈은 ECMAScript 2015에 도입되었습니다.

이것은 모듈 내부에서 직접 작동합니다. 内部时,而不是简单的

모듈의 초기 전역 실행 컨텍스트 내에서 this를 평가하면 GetThisBinding이 다음 단계를 수행하게 됩니다.

모듈에서 this 的值在全局上下文中始终是未定义 값은 전역 컨텍스트에서 항상 정의되지 않음입니다. 모듈은 암시적으로 엄격 모드에 있습니다.

3. evalcode

를 입력하세요.

두 가지 종류의 eval 호출이 있습니다: 직접간접. 이러한 구별은 ECMAScript 5판부터 존재했습니다.

  • 직접 eval 调用通常类似于 eval(...);(eval)(...); (或 ((eval))(); 등). 1 이것은 직접뿐입니다(호출 표현이 좁은 패턴을 따르는 경우). 2
  • Indirecteval调用涉及以任何其他方式调用函数引用eval。它可以是 eval?.(...), (..., eval)(...), window.eval(...), eval.call(...,...)给定 const aliasEval1 = eval; 等。 window.aliasEval2 = eval;,也可以是 aliasEval1()aliasEval2()代码>.分别给出 const originalEval = eval; window.eval = (x) => originalEval(x);,调用 eval()도 간접적입니다.

JavaScript에서 "(1, eval)('this') 대 eval('this')에 대한 chuckj의 답변을 확인하세요. Dmitry Soshnikov의 ECMA-262-5 세부 정보 – 2장: 엄격 모드 (Archived)(간접 eval() 호출을 사용할 수 있는 경우).

PerformEvaleval 代码。它创建一个新的 声明性环境记录 作为其 LexicalEnvironment,这是 GetThisEnvironment 从中获取 thiseval 코드를 실행합니다. 이는 GetThisEnvironment

인 LexicalEnvironment로 새로운

선언적 환경 레코드this出现在eval를 생성하여 > 값에서 this를 가져옵니다.

그런 다음

가 코드에 있으면 GetThisEnvironment가 호출되고 해당 값이 반환됩니다. 생성된

선언적 환경 기록

글로벌 환경 레코드

)을 기반으로 합니다. 🎜 🎜 🎜즉, 🎜
  • 직접 평가에서는 this 值不会改变;它取自名为 eval의 어휘 범위입니다.
  • 간접 평가에서는 this 值是全局对象 (globalThis).

新函数怎么样? — new Functioneval비슷하지만 코드를 즉시 호출하지 않고 함수를 생성합니다. this 바인딩은 다음 하위 섹션에 설명된 대로 잘 작동하는 함수를 호출할 때를 제외하고는 여기 어디에도 적용되지 않습니다.

4. function코드

를 입력하세요

함수를 호출할 때 함수 코드를 입력하세요.

함수 호출에는 네 가지 범주의 구문이 있습니다.

실제 함수 호출은

Call AO에서 발생하며, 이는 thisValue를 사용하여 호출 컨텍스트에 따라 결정됩니다. 이 매개변수는 호출과 관련된 긴 호출 목록에 전달됩니다. Call은 함수의 [[Call]] 내부 슬롯을 호출합니다. 이는 새로운 기능 환경 기록이 생성된 PrepareForOrdinaryCall을 호출합니다.

또한 함수 환경 레코드에는 [[ThisValue]] 필드도 있습니다.

NewFunctionEnvironment 호출은 함수 환경의 [[ThisBindingStatus]] 속성도 설정합니다.

[[Call]]OrdinaryCallBindThis도 호출합니다. 여기서 적절한 thisArgument는 다음을 기준으로 결정됩니다.

  • 원본 참조,
  • 함수 유형 및
  • 코드가 엄격 모드에 있는지 여부.

확인 후 새로 생성된 함수 환경 레코드의 BindThisValue 메서드가 최종적으로 호출되어 실제로 thisArgument에 추가할 [[ThisValue]] 필드를 설정합니다.

마지막으로 이 필드는 기능 환경 레코드입니다. GetThisBinding AO는 다음 위치에서 this 값을 가져옵니다.

다시 말하지만, this의 가치에 대한 정확한 결정은 여러 요인에 따라 달라집니다. 이는 단지 일반적인 개요일 뿐입니다. 이러한 기술적 배경을 바탕으로 구체적인 예를 모두 살펴보겠습니다.

화살표 기능

화살표 함수를 계산할 때 OrdinaryFunctionCreate에서 [[ThisMode]] 내부 슬롯 함수 개체의 속성이 "어휘적"으로 설정됩니다. p>

OrdinaryCallBindThis에는 F 함수가 필요합니다:

이는 나머지 알고리즘 바인딩 this을 건너뛰었음을 의미합니다. 화살표 함수는 자체 this 값을 바인딩하지 않습니다.

그렇다면 화살표 함수에서 this는 무엇일까요? ResolveThisBindingGetThisEnvironment을 검토하기 위해 HasThisBinding 메서드는 명시적으로 false를 반환합니다.

그래서 우리는 외부 환경을 반복적으로 찾습니다. 프로세스는 this 바인딩을 사용하는 세 가지 환경 중 하나에서 종료됩니다.

이것은 단지 화살표 함수 본문에서 this가 화살표 함수의 어휘 범위 에서 나온다는 것을 의미합니다. 즉, (화살표 함수 대 함수 선언/표현식: 동등/가환적입니까? ):

함수속성

일반 함수(function, 메서드 function方法),this) , 함수의 호출 방법

에 따라 결정됩니다.

여기서 "문법 변형"이 유용하게 사용됩니다.

함수를 포함하는 다음 객체를 생각해 보세요:

으아아아

또는: 🎜으아악

다음 함수 호출 중 하나에서 func 内的 this 值将为 refObj. 1

  • refObj.func()
  • refObj["func"]()
  • refObj?.func()
  • refObj.func?.()
  • refObj.func``

호출된 함수가 구문상 기본 개체의 속성인 경우 해당 기본 개체는 호출의 "참조"가 되며, 일반적인 경우에는 this 的值。上面链接的评估步骤对此进行了解释;例如,在 refObj.func() (或 refObj["func"]())中,CallMemberExpression 是整个表达式 refObj.func(),它由 MemberExpression refObj.func参数 ()this의 값이 됩니다. 위에 링크된 평가 단계는 이를 설명합니다. 예를 들어

(또는

)에서 refObj.funcrefObjCallMemberExpression

refObj.func作为是可调用的函数对象;相应的引用用于确定this().

게다가 ?.() 之前、``는 세 가지 역할을 수행합니다. 代码>

다 표현이에요,

모두 참고자료이고 그들은 모두 가치입니다. refObj.func 时为 refObj;或 foo.bar code> 当应用于 foo.bar.baz 바인딩. 선택적 링크 및 태그 템플릿 예제는 매우 유사하게 작동합니다. 기본적으로 참조 앞에는

또는

()이 옵니다. this。简单属性不会影响执行上下文,例如这里,this

EvaluateCall

IsPropertyReference을 사용하여 구문적으로 개체의 속성인지 확인합니다. 참조의 [[Base]] 속성을 얻으려고 시도합니다(예: 에 적용되는 경우). 속성으로 작성하면 GetThisValue

는 이 [[Base]] 속성을 가져와

this

값으로 사용합니다.

참고: 전역 범위에서 에 관해 Getters/Setters가 작동하는 방식:

으아악 🎜기본 참조 없음, 엄격 모드 및 🎜🎜with🎜🎜🎜 🎜기본 참조가 없는 호출은 일반적으로 속성으로 호출되지 않는 함수입니다. 예: 🎜 으아악 🎜이는 🎜메서드를 전달하거나 할당🎜할 때나 🎜쉼표 연산자🎜를 사용할 때도 발생합니다. 여기서는 참조 레코드와 값의 차이가 관련됩니다. 🎜

기능 j:按照规范,您会注意到j只能返回函数对象(Value)本身,而不能返回引用记录。因此,基本引用 refObj이 누락되었습니다.

으아아아

EvaluateCallcalls을 호출합니다. 여기서 thisValueundefine입니다. 이는 OrdinaryCallBindThis에서 다릅니다(F: 함수 개체; thisArgument: thisValueCall에 전달됨):

참고: 5단계에서는 this 的实际值设置为严格模式下提供的 thisArgument - 在本例中为 undefined。在“草率模式”下,未定义或 null thisArgument 会导致 this의 실제 값을 엄격 모드에서 제공되는 thisArgument로 설정합니다. 이 경우에는 정의되지 않음입니다. "엉성한 모드"에서는 정의되지 않았거나 null

thisArgument

로 인해 가 전역 this 값이 됩니다. IsPropertyReference

false를 반환하는 경우 EvaluateCall은 다음 단계를 수행합니다. 이것은 정의되지 않았습니다. thisValue 다음에서 올 수 있습니다: refEnv sec-with-statement-runtime-semantics-evaluation" rel="noreferrer"> 문의

을 제외하고 항상

undefine입니다. . 이 경우 Symbol.unscopables (MDN 上的文档)来控制 withthisValue

가 바인딩 개체가 됩니다.

Also

Symbol.unscopables

(

바인딩 동작을 제어하기 위한 MDN 문서 this). 지금까지 요약하자면:

으아아아

그리고: 으아아아 .call, .apply.bind계산할 때 일반적인 함수가 정의된 위치는 중요하지 않습니다.

.call

, .apply, .bind, thisArg 및 원시 OrdinaryCallBindThis🎜 5단계의 또 다른 결과는 6.2단계(사양의)와는 달리 원래 🎜this🎜 값이 "엉성한" 모드🎜에만 🎜 개체로 캐스팅된다는 것입니다. 🎜

이를 확인하기 위해 this 값의 또 다른 소스를 소개하겠습니다. this 바인딩을 재정의하는 세 가지 메서드: 4

  • Function.prototype.apply(thisArg, argArray)
  • Function.prototype. {调用, 绑定} (thisArg, ...args)李>

.bind.bind 创建一个绑定函数,其this 绑定已设置为 thisArg 并且无法再次更改。 .call.applythis 바인딩이 thisArg로 설정되고 다시 변경할 수 없는 바인딩 함수를 만듭니다. .call.apply

즉시 함수를 호출하고

this.call.apply 直接映射到 Call ,使用指定的thisArg.bindthisArg에 바인딩되도록 설정합니다. .call.applyCall

에 직접 매핑됩니다. 지정된

thisArg을 사용하세요. .bind BoundFunctionCreate

를 사용하여 바인딩된 함수를 만듭니다. 그들은 함수 객체의 [[BoundThis]] 내부 슬롯을 찾는 자체

[[Call ]] 메소드

를 가지고 있습니다.

사용자 정의

thisObject("s")new String("s") 값 설정 예: 으아아아 객체의 경우 이는 strict 모드와 non-strict 모드에서 동일합니다.

이제 원시 값을 제공해 보세요. this 으아아아

비엄격 모드에서는 기본 요소가 개체 래퍼 형식으로 강제됩니다.

를 호출할 때 얻는 것과 동일한 개체 유형입니다. 엄격 모드에서는 기본 요소를 사용할 수 있습니다. 으아아아 jQuery와 같은 이러한 방법을 사용하는 라이브러리는 여기에서 선택한 DOM 요소를 설정합니다.

으아아아

생성자, new 运算符将函数作为构造函数调用时,EvaluateNew 调用 Construct,它调用 [[Construct]] 方法。如果函数是基本构造函数(即不是 class extends...{...}),它会设置 thisArgument到从构造函数的原型创建的新对象。构造函数中 this 上设置的属性最终将出现在生成的实例对象上。 thisClass

및 🎜🎜🎜🎜 🎜 new 연산자를 사용하여 함수를 생성자로 호출할 때 EvaluateNewConstruct🎜를 호출하고 [[구성]] 메서드 🎜. 함수가 기본 생성자(즉, 클래스 확장...{...}가 아님)인 경우 🎜thisArgument🎜를 다음으로 설정합니다. 생성자의 프로토타입에 의해 생성된 새 객체의 값입니다. 생성자의 🎜에 설정된 속성은 결국 생성된 인스턴스 개체에 나타납니다. 🎜는 기본이 아닌 값을 명시적으로 반환하지 않는 한 암시적으로 반환됩니다. 🎜

class은 ECMAScript 2015에 도입된 생성자를 생성하는 새로운 방법입니다.

으아악

클래스 정의는 암시적으로 엄격 모드에 있습니다.

으아악

超级 H4>

new 行为的例外是 class extends...{...},如上所述。派生类在调用时不会立即设置其 this 值;它们只有在通过一系列 super 调用到达基类后才会这样做(在没有自己的构造函数的情况下隐式发生)。不允许在调用 super 之前使用 this.

supersuper 调用具有调用的词法范围(函数环境记录)的 this 值的超级构造函数。 GetThisValue 对于 super 调用有一个特殊的规则。它使用 BindThisValuethis를 호출하면 호출의 어휘 범위(함수 환경 레코드)에서

this

값을 사용하여 수퍼 생성자를 호출합니다. GetThisValue

super 호출에는 특별한 규칙이 있습니다. BindThisValue

를 사용하여

를 해당 환경 레코드로 설정합니다.

으아악 class5. 평가등급 분야 ECMAScript 2022에는 인스턴스 필드와 정적 필드가 도입되었습니다. 평가할 때 , ClassDefinitionEvaluation이 실행되어 실행 실행 컨텍스트

가 수정됩니다. 각
  • ClassElementthis
  • 에 대해:
  • this
  • 필드가 정적이면
는 클래스 자체를 참조하고,

#x필드가 정적이 아닌 경우

는 인스턴스를 나타냅니다.

Private 필드(예: ) 및 메서드가 Private 환경에 추가됩니다. this

정적 블록

은 현재 thisTC39 3단계 제안

입니다. 정적 블록은 정적 필드 및 메서드와 동일한 방식으로 작동합니다. 내부의 🎜는 클래스 자체를 나타냅니다. 🎜 🎜메서드 및 getter/setter에서 🎜는 일반 함수 속성과 동일하게 작동합니다. 🎜으아아아

1:(o.f)() 等价于 o.f()(f)() 相当于 f(). 이 2성 기사(보관됨). 특히 괄호로 묶인 표현을 평가하는 방법을 참조하세요.

2: MemberExpression em>이어야 하며 속성이 될 수 없으며 정확히 "eval"이 포함된 [[ReferencedName]]이 있어야 하며 %eval% 내장 개체여야 합니다.

3: 사양에 " ref 를 X 평가의 결과 로 놔두세요"라고 명시되어 있을 때마다 X는 평가 단계를 찾아야 하는 표현식입니다. 예를 들어 MemberExpression 또는 CallExpression을 평가하는 것은 이러한 알고리즘입니다. 그 중 일부는 참조 레코드를 생성합니다.

4: this 값, 특히 Array.prototype.map, Array.prototype.forEach 등을 제공할 수 있는 여러 가지 다른 기본 및 호스트 메서드가 있습니다. Array.prototype.map、Array.prototype.forEach 等接受 thisArg 作为第二个参数。任何人都可以创建自己的方法来更改 this,例如 (func, thisArg) => func.bind(thisArg)(func, thisArg) => func。 call(thisArg)thisArg를 두 번째 매개변수로 허용합니다. 누구든지 (func, thisArg) => func.bind(thisArg), (func, thisArg) => func와 같은 자신만의 메소드를 만들어 을 변경할 수 있습니다. call(thisArg) 등 언제나 그렇듯이

MDN
은 훌륭한 서비스 문서를 제공합니다.

재미로 몇 가지 예를 통해 이해도를 테스트해 보세요 this각 코드 조각에 대해 다음 질문에 답하세요. "표시된 줄에 있는

의 값은 무엇인가요? 왜

.인가요?"

답변을 보려면 회색 상자를 클릭하세요.
  1. 으아아아 globalThis

    . 표시된 줄은 초기 전역 실행 컨텍스트 내에서 평가됩니다.
  2. 🎜 🎜 으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿