在正常功能和箭头功能的上下文中对此有疑问

时间:2018-09-14 15:00:53

标签: javascript

从来没有完全理解箭头功能和法线功能的词汇作用域

this.thisGlobalVariable = 200;

function normalFunction() {
    this.thisVariable = 100;
}

function normalFunctionTwo() {
    console.log(this.thisVariable); // 100
    console.log(this.globalVariable); // undefined
}

let anonymousArrowFunction = () => {
    console.log(this.thisVariable); // undefined
    console.log(this.thisGlobalVariable); // 200

}
normalFunctionTwo();
anonymousArrowFunction();

因此,由于anonymousArrowFunction是一个箭头函数,因此它是词法(其作用域是在其中创建上下文的上下文),因此它将成为全局作用域,因为它能够访问this.thisGlobalVariable?而normalFunction和normalFunctionTwo作为普通函数会在自己的范围内创建自己的this? normalFunctionTwo如何访问normalFunction中定义的this.thisVariable?

2 个答案:

答案 0 :(得分:1)

“正常函数”通过调用方式来确定其上下文,因此:

 context.method();

呼叫method,其中this指向context。现在你要做

 normalFunctionTwo();

,它将在没有任何上下文的情况下调用该函数,然后上下文默认为window对象。因此,this内部(以及外部)的normalFunctionTwo指向window。在这种情况下,箭头功能没有区别。

答案 1 :(得分:1)

您误解了如何确定https://api.vimeo.com/users/XXXXXXXX/videos?fields=uri,duration,pictures.sizes.link,download&containing_uri=/videos/ID1,/videos/ID2&per_page=2 :引用MDN

  

在大多数情况下,其值取决于函数的调用方式。在执行过程中不能通过赋值来设置它,并且每次调用该函数时可能会有所不同。 ES5引入了bind方法来设置函数this的值,而不管其调用方式如何,ES2015引入了arrow函数,它们不提供自己的this绑定(它保留了封闭词法上下文的this值)。

this不会创建this的值,您不能直接为其分配值。而是在执行之前先解析function(请参见here)。这就是为什么可以使用thisFunction.applyFunction.call来显式设置Function.bind的原因。

“普通”函数声明和箭头函数声明之间的区别在于,第二个this自动绑定到封闭的词法上下文。


在您的代码段中,this始终引用全局范围。