this为什么会为undefined?

作者: 前端妹子ice | 来源:发表于2019-08-16 00:54 被阅读2次

一、前言

普通function定义的函数

‘运行环境’也是对象,this指向运行时所在的对象
如下:

如果一个函数在全局环境运行,this就指向顶层对象(浏览器中为window对象);
如果一个函数作为某个对象的方法运行,this就指向那个对象;
如果一个函数作为构造函数,this指向它的实例对象。

箭头函数

函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

本来记住这几点已经可以了,this最终找到是可能window,但是undefined是怎么又是怎么来的,本妹子下面将一步步分析。

二、问题点:undefined是怎么来的

综上所述,this指向运行时所在的对象或指向定义时所在的对象,但是这个对象可能最后找到是window,但都不可能是undefined,那么undefined是怎么来的呢?

<html>
<script type="text/javascript">
var foo = function foo() {
    console.log(this);
};
var foo1 = () => {
    console.log(this);
};
foo(); //Window
foo1(); //Window
</script>
</html>

三、回答

我们一般写js文件都是babel转成ES6的,babel会自动给js文件上加上严格模式。

image.png

用了严格模式"use strict"严格模式下无法再意外创建全局变量,所以this不为window而为undefined

<html>
<script type="text/javascript">
"use strict";  
var foo = function foo(){
    console.log(this)
};
foo();//undefined
</script>
</html>

四、进阶问题:严格模式对箭头函数没有效果

严格模式为什么对箭头函数没有效果,返回还是window

<html>
<script type="text/javascript">
"use strict";
var foo = () => {
    console.log(this)
};
foo(); //Window
</script>
</html>

五、进阶问题回答

Given that this comes from the surrounding lexical context, strict mode rules with regard to this are ignored.

lexical means that this refers to the this value of a lexically enclosing function.

综上所述,在箭头函数中,thislexical类型,lexical意味着这个this指是所在封闭函数中this,所以严格模式会自动忽视use strict,所以this如下所示:

<html>
<script type="text/javascript">
var foo = () => {
    "use strict";
    console.log(this)
};
foo(); //Window
</script>
</html>

箭头函数中,this指向运行时所在的对象,而use strict被移到函数内了,所以this为全局变量window

Happy coding ~~ ^ ^

相关链接

原文地址

严格模式 - JavaScript

Arrow functions - JavaScript

ECMAScript 2015 Language Specification – ECMA-262 6th Edition

函数的扩展 - ECMAScript 6入门

use strict in javascript not working for fat arrow? - Stack Overflow

相关文章

  • this为什么会为undefined?

    一、前言 普通function定义的函数 ‘运行环境’也是对象,this指向运行时所在的对象。如下: 如果一个函数...

  • JavaScript中void 0 与 undefined的区别

    前言 我们有些时候会看到这样的写法 void 0 返回undefined,但是为什么不直接 写undefined?...

  • 重学前端(二):JS里面的基本数据类型

    js里面的关于类型: 1,为什么有的编程规范,要求用void 0 代替undefined呢? Undefined其...

  • 问题总结

    1、为什么要用void 0 替代undefined? a)某些情况下用undefined判断存在风险,因undef...

  • 2017 / 8 / 11

    好奇怪, 为什么这个会报 undefined 的 warning

  • 变量提升

    首先我们看一段代码的执行 这段代码的输出是undefined, 为什么它会是undefined ,而不是a is ...

  • (妙味) 包装对象

    先上代码: 这里会打印什么呢?undefined(自问自答好无聊) 那么为什么会打印成undefined呢?......

  • apply找出数组中最大的元素&空元素变为undefin

    找出数组中最大的元素 将数组中的空元素变为undefined 为什么要将数组中的空元素变为undefined呢?空...

  • javascript基础

    为什么用void 0来代替undefined;? 因为undefined不是关键词,而是一个变量。可以用它来做变量...

  • 听雪伴你同行作业

    我会为什么而庆祝? 当我对抗的时候我是… 我会为什么而庆祝?我会为生活轮轴转而庆祝 我会为生活、工作压力山大而庆祝...

网友评论

    本文标题:this为什么会为undefined?

    本文链接:https://www.haomeiwen.com/subject/bbitsctx.html