今天在控制台写删除数组第一个元素的代码时,发现了一个问题,以下是书中源码,

let arr = [1,2,3,4,5]
Array.prototype.reIndex = function (myArray) {
const newArray = [];
for (let i=0; i<myArray.length; i++) {
if (myArray[i] !== undefined) {
newArray.push(myArray[i]);
}
}
return newArray;
}
Array.prototype.removeFirPos = function () {
for (let i=0;i<this.length;i++){
this[i] = this[i+1]
}
return this.reIndex(this)
} arr = arr.removeFirPos() console.log(arr)//控制台输出

按这个源码,我进行了更改,使用了箭头函数,如下

let arr = [1,2,3,4,5]
Array.prototype.reIndex = (myArray) => {
const newArray = [];
for (let i=0; i<myArray.length; i++) {
if (myArray[i] !== undefined) {
newArray.push(myArray[i]);
}
}
return newArray;
}
Array.prototype.removeFirPos = () => {
for (let i=0;i<this.length;i++){
this[i] = this[i+1]
}
return this.reIndex(this)
} arr = arr.removeFirPos() console.log(arr)//控制台输出

然后发现报错,typeerror:this.reIndex is not a function。查找下发现箭头函数没有自己的this。

我又想了一下,变量arr调用方法removeFirPos(),那么这个this不就是指向了arr吗,后来一想。。。这不是非箭头函数时候的指向嘛

然后继续网络查找找到了一句话:由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值

所有this的指向在非严格模式下是window。为了更好的理解我编写以下代码

function Test1() {
console.log(this);
setTimeout(() => {
console.log('这是箭头函数',this)
})
} function Test2() {
console.log(this);
setTimeout(function () {
console.log('这是普通函数',this)
})
}
let t1 = new Test1()
let t2 = new Test2()

输出结果如下

VM90:2 Test1 {}
VM90:9 Test2 {}

VM90:4 这是箭头函数 Test1 {}
VM90:11 这是普通函数 Window {window: Window, self: Window, document: document, name: "", location: Location, …}

原因是箭头函数捕获的是其所在上下文中的this值,而由于setTimeout()调用的代码运行在所在函数完全分离的执行环境上,this指向的是window(其实我也没咋明)

到这基本原因就明确了。

后面在我查找知识的时候,发现了let和var声明的不同,贴下人家的代码,这是在知乎找的(https://zhuanlan.zhihu.com/p/149239478)

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.log(this.myName)
}
}
let myName = "global"
let _printName = bar.printName
_printName() // undefined
bar.printName() // bar

仍然是_printName变量执行函数bar.printName,这次执行时因为是全局作用域下,输出的应该是window.myName。这下问题出来了,全局作用域下不是有myName吗

非也,起初我也迷惑,但后来代码放在控制台跑一下,发现其实let声明变量的作用域并非全域,而是在script域中,也就是说全域并没有myName这一变量,故输出undefined

bar调用函数printName执行,则执行环境在bar块作用域中,故输出bar

萌新小白,请教

 

let声明的全局变量不是window对象属性的更多相关文章

  1. 全局变量都是window对象的属性

    var x = "haha"; var test  = function(){ alert(this.x); } 上述,则会弹出 haha的值. 因为在JavaScript的变量作 ...

  2. javascript window对象属性和方法

    window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的 ...

  3. window对象属性alert、confirm、prompt怎么使用?

    window对象属性alert.confirm.prompt怎么使用? 一.总结 1.参数依次复杂,返回值依次复杂,但是感觉都是一一继承的,所以很好想也很好写. 二.window对象alert.con ...

  4. JavaScript Window对象属性

    window 代表浏览器中一个打开的窗口. Window的属性 属性 描述 closed 获取引用窗口是否已关闭. defaultStatus 设置或获取要在窗口底部的状态栏上显示的缺省信息. dia ...

  5. 【repost】js window对象属性和方法相关资料整理

    window对象有以下方法: open close alert confirm prompt setTimeout clearTimeout setInterval clearInterval mov ...

  6. 使用BOM 的window对象属性打开新窗口

    ★  示例1 要求:弹出新窗口,并向新窗口写入动态HTML代码 代码 <buttononclick="btnOpen()">打开新窗口</button> & ...

  7. Window对象属性

    2018-11-28 12:21:20

  8. Window对象

    Window对象:         Window 对象表示浏览器中打开的窗口,如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框 ...

  9. 第十二章:window对象

    第十一章介绍了window对象及其客户端javascript所扮演的核心角色:它是客户端javascript程序的全局对象.本章介绍window对象的属性和方法,这些属性定义了不同的API,但是只有一 ...

随机推荐

  1. 学习Jmeter,这一篇就够了

    Jmeter在软件测试中的常用功能,看完你应该就会了 1.Jmeter的下载安装 1.1  Jmeter的官方网址是:http://jmeter.apache.org/:下载最新的包到本地进行解压,路 ...

  2. 为Facebook messenger平台开发聊天机器人

    介绍 在电子商务网上商店发明之前,我们总是有机会与销售代表或分销商在选择商品或服务时交谈.在进入数字世界后,这个领域变得沉默.这样对顾客方便吗?我认为不是.向销售代表或经销商询问他们想要的产品或服务是 ...

  3. Word云(标签云)生成器控件。net Windows。形式在c#中

    下载demo - 37.1 KB 下载source code - 48.7 KB 背景 这种控制方式的灵感来自于一种名为Wordle的基于网络的免费单词云生成器.实际上,这个控件是我的项目http:/ ...

  4. 加快ASP。NET Core WEB API应用程序。第3部分

    下载source from GitHub 对ASP进行深度重构和优化.NET Core WEB API应用程序代码 介绍 第1部分.创建一个测试的RESTful WEB API应用程序. 第2部分.增 ...

  5. Python+Appium自动化测试(7)-截图方法

    一,selenium模块的两种截图方法 get_screenshot_as_file(filename) 参数filename为截图文件保存的绝对路径,如: driver.get_screenshot ...

  6. OpenSSL加密系统简介

    加密基本原理 OpenSSL移植到arm开发板参考  http://blog.chinaunix.net/uid-27717694-id-3530600.html 1.公钥和私钥: 公钥和私钥就是俗称 ...

  7. CentOS 7操作系统目录结构介绍

    CentOS 7操作系统目录结构介绍 操作系统存在着大量的数据文件信息,相应文件信息会存在于系统相应目录中,为了更好的管理数据信息,会将系统进行一些目录规划,不同目录存放不同的资源. 根下目录结构说明 ...

  8. 单调队列+线性dp题Watching Fireworks is Fun (CF372C)

    一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...

  9. 第二十四章 IPtables防火墙

    一.iptables防火墙基本概述 1.应用场景 1.主机安全2.端口转发/ip转发3.内部共享上网 2.iptables工作流程 1.配置防火墙规则可以添加在下面,也可以添加在前面,是有顺序的2.匹 ...

  10. Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储

    原文链接:https://fuckcloudnative.io/posts/kubernetes-storage-using-ceph-rbd/ 本文详细介绍了如何在 Kubernetes 集群中部署 ...