Related recommendations:2021 Big Front-End Interview Questions Summary (Collection)
In JavaScript,this
is the function calling context. It is precisely because the behavior ofthis
is complicated that questions aboutthis
are always asked in JavaScript interviews.
The best way to prepare for an interview is to practice, so this article has compiled 7 interesting interviews forthis
keywords:
Note: The following JavaScript code snippet begins with Run in non-strict mode.
Directory:
Question 1: Variables vs Attributes
Question 2: Cat’s name
Question 3: Delayed output
Question 4: Complete code
Question 5: Greetings and Farewells
Question 6: The tricky length
Question 7: Calling parameters
Related tutorial recommendations:javascript video tutorial
The following code will be output What:
const object = { message: 'Hello, World!', getMessage() { const message = 'Hello, Earth!'; return this.message; }}; console.log(object.getMessage()); // 输出什么??
Output:'Hello, World!'
object.getMessage( )
is a method call, that's whythis
in the method is equal toobject
.
There is also a variable declaration in the methodconst message ='Hello, Earth!'
, but this variable will not affect the value ofthis.message
.
What will the following code output:
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()); // 输出什么??
Output:'Fluffy'
and'Fluffy'
When a function is called as a constructor (new Pet('Fluffy ')
),thisinside the constructor is equal to the constructed object.
Pet
Thethis.name = name
expression in the constructor creates thename
property on the constructed object.
this.getName = () => this.name
Create methodgetName
on the constructed object. And because of the use of arrow functions,thisin the arrow function is equal tothis
in the outer scope, which is the constructorPet
.
Callingcat.getName()
andgetName()
will return the expressionthis.name
, which evaluates to' Fluffy'
.
What does the following code output:
const object = { message: 'Hello, World!', logMessage() { console.log(this.message); // 输出什么?? } }; setTimeout(object.logMessage, 1000);
After a delay of 1 second, output:undefined
Although thesetTimeout()
function usesobject.logMessage
as a callback, it stillobject.logMessage
Called as a regular function rather than a method.
During a regular function call,thisis equal to the global object, which iswindow
in the browser environment.
This is whyconsole.log(this.message)
in thelogMessage
method outputswindow.message
, which isundefined
.
How to call the logMessage function so that it outputs"Hello, World!"
.
const object = { message: 'Hello, World!' }; function logMessage() { console.log(this.message); // => "Hello, World!" } // 把你的代码写在这里.....
There are at least 3 ways to do it:
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();
What will the following code output:
const object = { who: 'World', greet() { return `Hello, ${this.who}!`; }, farewell: () => { return `Goodbye, ${this.who}!`; } }; console.log(object.greet()); // 输出什么?? console.log(object.farewell()); // 输出什么??
Output:'Hello, World!'
and'Goodbye, undefined!'
When callingobject.greet()
, inside thegreet()
method,this
The value is equal to object becausegreet
is a regular function. Thereforeobject.greet()
returns'Hello, World!'
.
Butfarewell()
is an arrow function, and thethis
value in the arrow function is always equal to thethis
value in the outer scope. The outer scope of
farewell()
is the global scope, wherethis
is the global object. Thereforeobject.farewell()
will actually return'Goodbye, ${window.who}!'
, which results in'Goodbye, undefined!'
.
What will the following code output:
var length = 4; function callback() { console.log(this.length); // 输出什么?? } const object = { length: 5, method(callback) { callback(); } }; object.method(callback, 1, 2);
Output:4
callback()
is called using a regular function call insidemethod()
. Since thethisvalue during a regular function call is equal to the global object,this.length
in thecallback()
function results inwindow.length
.
第一个语句var length = 4
,处于最外层的作用域,在全局对象上创建了属性length
,所以window.length
变为4
。
最后,在callback()
函数内部,`this.length
的值为window.length
,最后输出4
。
以下代码会输出什么:
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/
更多编程相关知识,请访问:编程视频!!
The above is the detailed content of 7 interesting interview questions about 'this' in JavaScript, can you answer them all correctly?. For more information, please follow other related articles on the PHP Chinese website!