从来没有完全理解箭头功能和法线功能的词汇作用域
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?
答案 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)。这就是为什么可以使用this
,Function.apply
和Function.call
来显式设置Function.bind
的原因。
“普通”函数声明和箭头函数声明之间的区别在于,第二个this
自动绑定到封闭的词法上下文。
在您的代码段中,this
始终引用全局范围。