let声明的全局变量不是window对象属性

更新时间:2023-06-09 10:57:29 阅读: 评论:0

let声明的全局变量不是window对象属性
今天在控制台写删除数组第⼀个元素的代码时,发现了⼀个问题,以下是书中源码,
let arr = [1,2,3,4,5]
Index = function (myArray) {
const newArray = [];
for (let i=0; i<myArray.length; i++)  {
if (myArray[i] !== undefined) {
beanstalk
newArray.push(myArray[i]);
}
}
return newArray;
}
veFirPos = function () {
日文翻译成中文for (let i=0;i<this.length;i++){
this[i] = this[i+1]
}
Index(this)
}lighter
arr = veFirPos()
console.log(arr)//控制台输出
按这个源码,我进⾏了更改,使⽤了箭头函数,如下
let arr = [1,2,3,4,5]
Index = (myArray) => {
const newArray = [];
for (let i=0; i<myArray.length; i++)  {
保鲜膜英文if (myArray[i] !== undefined) {
上衣的英语单词newArray.push(myArray[i]);
}
}
return newArray;
}
veFirPos = () => {
for (let i=0;i<this.length;i++){
follow your heart
this[i] = this[i+1]
}
Index(this)
}
arr = veFirPos()
console.log(arr)//控制台输出
然后发现报错,Index is not a function。查找下发现箭头函数没有⾃⼰的this。
我⼜想了⼀下,变量arr调⽤⽅法removeFirPos(),那么这个this不就是指向了arr吗,后来⼀想。。。这不是⾮箭头函数时候的指向嘛然后继续⽹络查找找到了⼀句话:由于箭头函数不绑定this,它会捕获其所在(即定义的位置)上下⽂的this值,作为⾃⼰的this值所有this的指向在⾮严格模式下是window。为了更好的理解我编写以下代码
function Test1() {
console.log(this);
tTimeout(() => {
console.log('这是箭头函数',this)
})
}
function Test2() {
console.log(this);
tTimeout(function () {
console.log('这是普通函数',this)
})
temperature怎么读}
let t1 = new Test1()
let t2 = new Test2()
输出结果如下
VM90:2 Test1 {}
VM90:9 Test2 {}
VM90:4 这是箭头函数 Test1 {}
VM90:11 这是普通函数 Window {window: Window, lf: Window, document: document, name: "", location: Location, …}
原因是箭头函数捕获的是其所在上下⽂中的this值,⽽由于tTimeout()调⽤的代码运⾏在所在函数完全分离的执⾏环境上,this指向的是window(其实我也没咋明)
到这基本原因就明确了。
var bar = {
myName:"bar",
printName: function () {
console.log(myName)
}
}
let myName = "global"
let _printName = bar.printName
_printName() // global
bar.printName() // global
对于这个代码都⽐较好理解,前⾯全局变量bar,myName,_printName的声明,然后_printName声明这⾏,bar.printName是⼀函数,让变量_printName执⾏了这⼀函数这个杀手不太冷台词
然后在全局作⽤域下直接调⽤了函数,则输出的myName将在全局域中查找为global;最后⼀⾏相同原理
然后对代码稍加更改
var bar = {
myName:"bar",
printName: function () {
console.Name)
}
吸血鬼日记 第二季}大写一怎么写
let myName = "global"
let _printName = bar.printName
_printName() // undefined
bar.printName() // bar
仍然是_printName变量执⾏函数bar.printName,这次执⾏时因为是全局作⽤域下,输出的应该是Name。这下问题出来了,全局作⽤域下不是有myName吗
⾮也,起初我也迷惑,但后来代码放在控制台跑⼀下,发现其实let声明变量的作⽤域并⾮全域,⽽是在script域中,也就是说全域并没有myName这⼀变量,故输出undefined
bar调⽤函数printName执⾏,则执⾏环境在bar块作⽤域中,故输出bar
萌新⼩⽩,请教

本文发布于:2023-06-09 10:57:29,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/139140.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   箭头   代码   发现   控制台   输出
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图