关于前端:这-7-道关于-this-的面试题你能答对几个

27次阅读

共计 3433 个字符,预计需要花费 9 分钟才能阅读完成。

在 JavaScript 中,this 是函数调用上下文。正是因为 this 的行为很简单,所以在 JavaScript 面试中,总是会问到无关 this 的问题。

做好的筹备面试的办法是练习,所以本文针对 this 关键字整顿了 7 个乏味的面试。

留神:上面的 JavaScript 代码段以非严格模式运行。

1:变量与属性

以下代码输入什么:

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:猫的名字

以下代码输入什么:

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 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

挑战:怎么批改这段代码使其输入 'Hello, World!'?在上面的评论中写出你的解决方案*

4:补全代码

补全代码,使后果输入 "Hello,World!"

const object = {message: 'Hello, World!'};

function logMessage() {console.log(this.message); // => "Hello, World!"
}

// Write your code here...

答案:

至多有 3 种形式能够把 logMessage() 作为对象上的办法调用。任何一个都被看作是正确答案:

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 的值 总是 等于内部作用域的 thisfarewell() 的内部作用域是全局作用域,其中 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

应用 method() 外部的惯例函数调用来调用 callback()。因为在惯例函数调用期间的 this 值等于全局对象,所以在 callback() 函数中 this.lengthwindow.length

位于最外层的第一个语句 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 个参数进行调用:callback12。后果 method() 内的arguments 非凡变量是有以下构造的相似数组的对象:

{
  0: callback,
  1: 1, 
  2: 2, 
  length: 3 
}

因为 arguments[0]() 是对 arguments 对象上 callback 的办法调用,所以 callback 外部的 this 等于 arguments。后果在 callback() 外部的 this.lengtharguments.length 是雷同的,都是3

总结

如果你答对了 5 个以上,那么你对 this 关键字把握的状况是很不错的。


本文首发微信公众号:前端先锋

欢送扫描二维码关注公众号,每天都给你推送陈腐的前端技术文章


欢送持续浏览本专栏其它高赞文章:

  • 深刻了解 Shadow DOM v1
  • 一步步教你用 WebVR 实现虚拟现实游戏
  • 13 个帮你进步开发效率的古代 CSS 框架
  • 疾速上手 BootstrapVue
  • JavaScript 引擎是如何工作的?从调用栈到 Promise 你须要晓得的所有
  • WebSocket 实战:在 Node 和 React 之间进行实时通信
  • 对于 Git 的 20 个面试题
  • 深刻解析 Node.js 的 console.log
  • Node.js 到底是什么?
  • 30 分钟用 Node.js 构建一个 API 服务器
  • Javascript 的对象拷贝
  • 程序员 30 岁前月薪达不到 30K,该何去何从
  • 14 个最好的 JavaScript 数据可视化库
  • 8 个给前端的顶级 VS Code 扩大插件
  • Node.js 多线程齐全指南
  • 把 HTML 转成 PDF 的 4 个计划及实现

  • 更多文章 …

正文完
 0