前端进阶必读:《JavaScript核心技术开发解密》核心提炼二
前言
最近读勒基本关于前端的数据《JavaScript核心技术开发解密》,《webpack从入门到进阶》...这几本书帮助到我更好的理解JS、webpack在前端技术领域中的作用。以前可能更多的是知道怎么使用,但从未从更深的层面去思考他们是如何运作,为什么会产生这种特性,等等...
这本书先从《JavaScript核心技术开发解密》开始讲解,分为两篇讲完,读完本篇你能学到:
前端进阶必读:《JavaScript核心技术开发解密》核心提炼一
前端进阶必读:《JavaScript核心技术开发解密》核心提炼三
@
五、作用域与作用域链
在JS中,作用域是用来规定变量/函数可访问的规则
5.1作用域
5.1.1全局作用域
在非严格模式,未定义的变量/函数会自动的变成window的属性;
在实践中,尽可能的减少使用全局变量/函数,为了减少协作冲突,提高性能(全局作用域在作用域链的链尾)
5.1.2函数作用域
在ES6之前,es是没有块级作用域的,所以一定是在函数环境中才能生成新作用域
案例:
var arr = [1,2,3];
for(var i = 0; i < arr.length; i++) {
console.log(i);
}
console.log(i); // 4
5.1.3模拟块级作用域
A: 利用函数产生
var arr = [1,2,3];
// 匿名自执行函数执行会产生函数作用域
(function () {
for(var i = 0; i < arr.length; i++) {
console.log(i);
}
})()
// 匿名自执行函数的几种写法
(function(){})() // 最常用
*function(){}()
-function(){}()
!function(){}()
重要知识来了:
在ES中,往往通过自执行函数来实现模块化;
模块化是非常重要的开发思维
5.2作用域链
scopeChain是当前执行环境的上层执行环境的一系列变量对象组成,串联作用域。
案例:
var a = 20;
function test () {
var b = a + 10;
function innerTest () {
var c = 10;
return b + c;
}
return innerTest;
}
test();
/**
以上代码innerText的作用域链如下:
innerTestEC = {
VO: {...}, // 变量对象
scopeChain: [VO(innerTest),VO(test),VO(window)], // 好好看这里!
this: {...}
}
**/
6、闭包
到了这里,就到了前端是个人都听过的东西了,极其重要的特性!!!
6.1概念
闭包是一种特殊对象
由两部分组成:
- 执行上下文A
- 该执行上下文创建的函数B
B执行时,刚问了A中的值,闭包即产生
6.2闭包与垃圾回收机制
正常的上下文运行后,内部的内容都是去了引用而被垃圾回收,但闭包导致A的变量被B持有,阻止了垃圾回授(所以也会导致性能问题)
6.3闭包与作用域链
- 作用域链在编译中以确定规则,在执行中产生
- 函数调用栈在执行中才确定
6.4 在chrome开发工具中能够观察函数调用栈,作用域链与闭包
6.5 应用闭包
6.5.1 循环、setTtimeOut与闭包
案例:
利用闭包的知识,修改下面这段代码,让代码的执行结果为隔秒输出1,2,3,4,5
for(var i = 0; i <= 5; i++) {
setTimeOut(function timer() {
console.log(i);
},i * 1000 )
}
利用闭包修改
for(var i = 0; i <= 5; i++) {
(function (i) {
setTimeOut(function timer() {
console.log(i);
},i * 1000 )
})(i)
}
或者
for(var i = 0; i <= 5; i++) {
setTimeOut((function (i) {
return function timer () {
console.log(i);
}
})(i), i * 1000 )
}
6.5.2单例模式与闭包
在JS中有许多编程思维,其中单例模式时实践中最常用的模式之一,而它的实现与闭包息息相关
七、this
鸡婆一下:来到这个很多人都搞不清楚this指向的问题了,看完这一样相信你会豁然开朗,因为this指向其实比想象中要简单得多。
7.1 this指向
当函数被调用执行时,函数进入创建阶段(前面有讲到),此时会生成变量对象,this确定指向,还做了XXX,随后进入执行阶段。
案例:
var a = 10;
var obj = {
a : 20
}
function fn () {
console.log(this.a);
}
fn(); // 10 (方法时一定有调用者的,这里省略是因为在非严格模式下,自动变成window.fn())
fn.call(obj); // 20 因为fn函数的执行上下文this被修改成obj对象
7.2 call/apply/bind显示绑定this
相信很多人都知道这三个函数的作用,call/apply几乎一样,知只是传参规则不同,bind是先绑定,返回绑定后的方法,未执行。
| call | apply | bind |
|---|---|---|
| 直接传参 | 数组传参 | 直接传参(不立即执行,而是返回修改this后的方法) |
ES6中的箭头函数是不能改变this的,使用以上三个方法也不能(先预告,后面会讲到)
八、面向对象
8.1.1
// 构造函数与普通函数并无区别,首字母大写是约定的习惯,new关键字才是将构造方法变得与众不同
var Person = function (name, age) {
this.name = name;
this.age = age;
}
Person.protptype.getName = function () {
return this.name
}
8.1.2 new关键字
下面我们来模拟一边new关键字的作用
function New (constructFunc) {
// 生命中间对象,最后作为返回的实例,相当于let obj = New(Obj); => obj = res
var res = {};
if(constructFunc.prototype !== null) {
// 将实例的原型指向构造函数的原型
res.__proto__ = constructFunc.prototype;
}
// ret为该构造函数执行的结果,将构造函数的this改为执行res
var ret = constructFunc.apply(res, Array.prototype.slice.call(arguments, 1));
// 如果构造函数有返回值,则直接返回
if((typeof rest === "object" || typeof ret === "function") && ret !== null) {
return ret;
}
// 否则返回该实例
return res;
}
总结:
- 先创建空的、新的实例对象(New(func)返回的对象)
- 将实例对象的原型指向构造函数的原型
- 将构造函数的this改为指向实例对象
- 最后返回该实例对象(如果构造函数本身有返回则直接返回)
8.1.3更简单的原型写法
function Person () {};
Person.prototype.getName = function () {};
Person.prototype.getAge = function () {};
// 简化
Person.prototype = {
construor : Person, // 此时Person.protottype指向了新的对象,所以会导致原型对象丢失,所以加上此行
getName : function () {},
getAge: function () {},
}
8.1.4实例方法、原型方法、静态方法
function Foo () {
this.bar = fucntion () { // 实例方法
return 'bar in Foo';
}
}
Foo.bar = function () {return 'static'} // 静态方法
Foo.prototype.bar = function () {return 'prototype'} // 原型方法
前端进阶必读:《JavaScript核心技术开发解密》核心提炼二的更多相关文章
- 高德地图 JavaScript API 开发系列教程(二)
上节简单介绍高德地图JavaScript API及网页中基本地图展示.有了地图后我们可以用来做什么?有人说离我最近的超市在哪里,我怎么去?别急,这些功能我们后面都会慢慢实现.今天为大家详细讲解如何在地 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- 我在阿里这仨月 前端开发流程 前端进阶的思考 延伸学习的方式很简单:google 一个关键词你能看到十几篇优秀的博文,再这些博文中寻找新的关键字,直到整个大知识点得到突破
我在阿里这仨月 Alibaba 试用期是三个月,转眼三个月过去了,也到了转正述职的时间.回想这三个月做过的事情,很多很杂,但还是有重点. 本文谈一谈工作中遇到的各种场景,需要用到的一些前端知识,以及我 ...
- [前端进阶课] 构建自己的 webpack 知识体系
webpack webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件. Webpack 核心概念: Entry(入口):Webpack 执 ...
- Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。
随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...
- 前端js之JavaScript
知识预览 一小知识 二 JavaScript的基础 BOM对象 DOM对象 实例练习 js拓展 小知识 核心(ECMAScript) 文档对象模型(DOM) Document object model ...
- 前端基础之JavaScript day51
前端基础之JavaScript JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中) ...
- 前端工程师(JavaScript)在业余时间如何提高自身能力
1.前端工程师(JavaScript)在业余时间如何提高自身能力? https://www.zhihu.com/question/40186398?sort=created 2.前端开发工程师必读书籍 ...
- 腾讯Web前端开发框架JX(Javascript eXtension tools)
转自:Web前端开发-Web前端工程师 » 腾讯Web前端开发框架JX(Javascript eXtension tools) JX – Javascript eXtension tools 一个类似 ...
随机推荐
- Oracle常见错误以及解决方法
前言: 本博客为博主在开发中遇到的问题,为大家提供解决方法,如需转载,请注明来源,谢谢! 问题一: 第一次用PLSQL Developer连接数据库,若用sys用户登录并操作则正常,若用普通用户比如x ...
- 云上自动化 vs 云上编排
1 摘要 本文介绍了为什么在一个好的公有云或私有云中必须要有一个编排系统来支持云上自动化,以及实现这个编排系统的困难和各家的努力.同时提供了一套实现编排系统的原型,它包括了理论分析及主体插件框架,还给 ...
- deepin换源
python的pip源 pip install pip -U pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/sim ...
- APP自动化 -- 获取driver
一.appium设置 1.打开appium 2.设置 appium服务器:点击 高级设置 3.启动 appium 服务器 二.查看 .apk 安装包的“包名”和“活动入口名” 1.先复制本地 ...
- 打开chm文件时出现“无法显示此页:确保 Web 地址 //ieframe.dll/dnserrordiagoff.htm# 正确”的解决办法
当我们打开chm文件时遇到下面这种情况: 解决方法: 1.一般情况下无法显示网页:右键 chm文件属性里最下面有个"解除锁定",点击"解除锁定"按钮就可以了. ...
- python自带函数
callable() #是否可以被执行,是否可以被调用 chr() #返回整数i对应的ASCII字符.与ord()作用相反.参数x:取值范围[0, 255]之间的正数. ord() #参数是一个asc ...
- 如何使用Excel管理项目?
1.什么是复杂问题? 复杂问题需要很多道工序,涉及到与多个人进行沟通,人的注意力没法持续关注,导致很容易忘掉很多重要步骤.像这种问题就要用到项目管理工具,在重要的节点上,来检查自己是否遗漏了重要的环节 ...
- java图片压缩工具类(指定压缩大小)
1:先导入依赖 <!--thumbnailator图片处理--> <dependency> <groupId>net.coobird</groupId> ...
- 三类安装VMTools失败的解决方法(Windows、Linux、MacOs)
前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...
- electron开发 - mac平台的打包和签名 - 针对electron-builder的自动更新
配合自动更新 - 安装包签名(mac)(待补充) 前提:实现自动更新需要签名 一.本地开发调试mac签名(无需具有权限的appple账号) 打开xcode,xcode -> preference ...