JavaScript의 'this'에 관한 7가지 흥미로운 인터뷰 질문에 모두 올바르게 답할 수 있습니까?
관련 추천: 2021 빅 프론트엔드 면접 질문 요약(모음)
JavaScript에서 this
는 함수 호출 컨텍스트입니다. this
의 동작이 복잡하기 때문에 JavaScript 인터뷰에서는 항상 this
에 대한 질문을 받습니다. this
是函数调用上下文。正是由于 this
的行为很复杂,所以在 JavaScript 面试中,总是会问到有关 this
的问题。
做好的准备面试的方法是练习,所以本文针对 this
关键字整理了 7 个有趣的面试:
注意:下面的 JavaScript 代码段以非严格模式运行。
目录:
问题1:变量 vs 属性
问题2:Cat 的名字
问题3:延迟输出
问题4:补全代码
问题5:问候与告别
问题6:棘手的 length
问题7:调用参数
相关教程推荐:javascript视频教程
问题1:变量 vs 属性
以下代码会输出什么:
const object = { message: 'Hello, World!', getMessage() { const message = 'Hello, Earth!'; return this.message; }}; console.log(object.getMessage()); // 输出什么??
答案:
输出: 'Hello, World!'
object.getMessage()
是一个方法调用,这就是为什么方法中的 this
等于 object
的原因。
方法中还有一个变量声明 const message ='Hello,Earth!'
,但这个变量不会影响 this.message
的值。
问题2:Cat 的名字
以下代码会输出什么:
function Pet(name) { this.name = name; this.getName = () => this.name; } const cat = new Pet('Fluffy'); console.log(cat.getName()); // 输出什么?? const { getName } = cat; console.log(getName()); // 输出什么??
答案:
输出:'Fluffy'
和 'Fluffy'
当一个函数被当作构造函数调用时( new Pet('Fluffy')
),构造函数内部的 this 等于构造的对象。
Pet
构造函数中的 this.name = name
表达式在构造的对象上创建 name
属性。
this.getName = () => this.name
在构造的对象上创建方法 getName
。而且由于使用了箭头函数,箭头函数中的 this 等于外部作用域中的 this
,也就是构造函数 Pet
。
调用 cat.getName()
和 getName()
会返回表达式 this.name
,其计算结果为 'Fluffy'
。
问题3:延迟输出
以下代码输出什么:
const object = { message: 'Hello, World!', logMessage() { console.log(this.message); // 输出什么?? } }; setTimeout(object.logMessage, 1000);
答案:
延迟1秒钟后,输出:undefined
尽管 setTimeout()
函数使用 object.logMessage
作为回调,但仍把 object.logMessage
作为常规函数而非方法调用。
在常规函数调用期间, this 等于全局对象,即浏览器环境中是 window
。
这就是为什么 logMessage
方法内的 console.log(this.message)
输出 window.message
,即 undefined
。
问题4:补全代码
如何调用logMessage函数,让它输出 "Hello,World!"
。
const object = { message: 'Hello, World!' }; function logMessage() { console.log(this.message); // => "Hello, World!" } // 把你的代码写在这里.....
答案:
至少有 3 种方式,可以做到:
const object = { message: 'Hello, World!' }; function logMessage() { console.log(this.message); // => 'Hello, World!' } // 使用 func.call() 方法 logMessage.call(object); // 使用 func.apply() 方法 logMessage.apply(object); // 使用函数绑定 const boundLogMessage = logMessage.bind(object); boundLogMessage();
问题5:问候与告别
以下代码会输出什么:
const object = { who: 'World', greet() { return `Hello, ${this.who}!`; }, farewell: () => { return `Goodbye, ${this.who}!`; } }; console.log(object.greet()); // 输出什么?? console.log(object.farewell()); // 输出什么??
答案:
输出: 'Hello, World!'
和 'Goodbye, undefined!'
当调用object.greet()
时,在greet()
方法内部,this
值等于 object,因为greet
是一个常规函数。因此object.greet()
返回'Hello, World!'
。
但是farewell()
是一个箭头函数,箭头函数中的this
值总是等于外部作用域中的this
值。
farewell()
的外部作用域是全局作用域,其中 this
是全局对象。因此 object.farewell()
实际上会返回 'Goodbye, ${window.who}!'
,它的结果为 'Goodbye, undefined!'
。
问题6:棘手的 length
以下代码会输出什么:
var length = 4; function callback() { console.log(this.length); // 输出什么?? } const object = { length: 5, method(callback) { callback(); } }; object.method(callback, 1, 2);
答案:
输出:4
callback()
是在method()
内部使用常规函数调用来调用的。由于在常规函数调用期间的 this 值等于全局对象,所以在 callback()
函数中 this.length
结果为 window.length
this
키워드를 기반으로 7개의 흥미로운 인터뷰를 편집했습니다. 🎜🎜참고: 다음 JavaScript 코드 조각은 비엄격 모드에서 실행됩니다. . 🎜🎜🎜디렉터리: 🎜🎜- 🎜질문 1: 변수와 속성 🎜
- 🎜질문 2 :고양이 이름🎜
- 🎜질문 3: 지연된 출력🎜
- 🎜질문 4: 전체 코드🎜
- 🎜질문 5: 인사 및 작별 인사🎜
- 🎜질문 6: 까다로운 길이🎜
- 🎜질문 7: 매개변수 호출🎜
질문 1: 변수와 속성🎜다음 코드는 무엇을 출력할까요?🎜var length = 4;
function callback() {
console.log(this.length); // 输出什么??
}
const object = {
length: 5,
method() {
arguments[0]();
}
};
object.method(callback, 1, 2);
로그인 후 복사로그인 후 복사
답변:
🎜출력: 'Hello, World!'
🎜🎜object . getMessage()
는 메소드 호출이므로 메소드의 this
가 object
와 같습니다. 🎜🎜메서드에 const message ='Hello, Earth!'
변수 선언도 있지만 이 변수는 this.message
값에 영향을 미치지 않습니다. 🎜
질문 2: 고양이 이름🎜
🎜다음 코드는 무엇을 출력합니까? 🎜{
0: callback,
1: 1,
2: 2,
length: 3
}
로그인 후 복사로그인 후 복사
답변:
🎜출력: 'Fluffy'
및 'Fluffy'
🎜🎜함수가 생성자로 호출되는 경우( new Pet('Fluffy')
), this 생성자 내부는 생성된 객체와 동일합니다. 🎜🎜 Pet
생성자의 this.name = name
표현식은 생성된 객체에 name
속성을 생성합니다. 🎜🎜this.getName = () => this.name
생성된 개체에 getName
메서드를 만듭니다. 그리고 화살표 함수를 사용하기 때문에 화살표 함수의 this는 생성자 Pet
인 외부 범위의 this
와 동일합니다. 🎜🎜cat.getName()
및 getName()
을 호출하면 'Fluffy'로 평가되는 <code>this.name
표현식이 반환됩니다. . 🎜
질문 3: 지연된 출력🎜
🎜다음 코드는 무엇을 출력합니까? 🎜rrreee답변:
🎜1초 지연 이후 출력: undefine
🎜🎜setTimeout()
함수는 object.logMessage
를 콜백으로 사용하지만 여전히 객체를 사용합니다. .logMessage는 메소드가 아닌 일반 함수로 호출됩니다. 🎜🎜일반 함수 호출 중에 <em>this</em>는 브라우저 환경에서 <code>window
인 전역 개체와 동일합니다. 🎜🎜이것이 logMessage
메소드의 console.log(this.message)
가 window.message
, 즉 unjust를 출력하는 이유입니다. 코드 코드>. 🎜<h2 id="strong-질문-코드-완성-strong"><strong>질문 4: 코드 완성</strong></h2>🎜 <code>"Hello, World!"
를 출력하도록 logMessage 함수를 호출하는 방법. 🎜rrreee답변:
🎜 적어도 3가지 방법이 있습니다: 🎜rrreee질문 5: 인사와 작별 인사
🎜다음 코드는 무엇을 출력할까요?🎜rrreee답변:
🎜출력: 'Hello, World!'
및 'Goodbye, 정의되지 않음 !'
🎜🎜 greet()
메서드 내부에서 object.greet()
를 호출할 때 this
값은 같습니다. 이의를 제기하려면 인사
가 일반 함수이기 때문입니다. 따라서 object.greet()
는 'Hello, World!'
를 반환합니다. 🎜🎜하지만 farewell()
은 화살표 함수이고 화살표 함수의 this
값은 항상 외부의 this
값과 같습니다. 범위. 🎜🎜 farewell()
의 외부 범위는 전역 범위이며, 여기서 this
는 전역 개체입니다. 따라서 object.farewell()
은 실제로 'Goodbye, ${window.who}!'
를 반환하고 결과적으로 'Goodbye, undefine!'이 됩니다. . 🎜<h2 id="strong-질문-까다로운-길이-strong"><strong>질문 6: 까다로운 길이</strong></h2>🎜다음 코드는 무엇을 출력합니까? 🎜rrreee<h4 id="strong-답변-strong"><strong>답변: </strong></h4>🎜출력: 4
🎜🎜callback()
은 method()
내부의 일반 함수 호출을 사용하여 호출됩니다. 일반 함수 호출 중 this 값이 전역 개체와 동일하므로 callback()
함수의 this.length
결과는 창 .길이. 🎜
var length = 4; function callback() { console.log(this.length); // 输出什么?? } const object = { length: 5, method() { arguments[0](); } }; object.method(callback, 1, 2);
{ 0: callback, 1: 1, 2: 2, length: 3 }
第一个语句var length = 4
,处于最外层的作用域,在全局对象上创建了属性 length
,所以 window.length
变为 4
。
最后,在 callback()
函数内部,`this.length
的值为 window.length
,最后输出 4
。
问题7:调用参数
以下代码会输出什么:
var length = 4; function callback() { console.log(this.length); // 输出什么?? } const object = { length: 5, method() { arguments[0](); } }; object.method(callback, 1, 2);
答案:
输出:3
obj.method(callback, 1, 2)
被调用时有3
个参数:callback
、1
和 2
。结果, method()
内部的arguments
特殊变量是有如下结构的数组类对象:
{ 0: callback, 1: 1, 2: 2, length: 3 }
因为 arguments[0]()
是 arguments
对象上 callback
的方法调用,所以 callback
内部的 this
等于 arguments
。所以 callback()
内部的 this.length
与 arguments.length
的结果是相同的,都是3
。
总结
如果你答对了 5 个以上,那么你对 this
关键字掌握的情况是很不错的。否则,你就需要好好复习一下 this
关键字。
本文翻译于:https://dmitripavlutin.com/javascript-this-interview-questions/
更多编程相关知识,请访问:编程视频!!
위 내용은 JavaScript의 'this'에 관한 7가지 흥미로운 인터뷰 질문에 모두 올바르게 답할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

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

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

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가
