前端基础进阶,来做通用的前端组件化架构设计

2019-10-19 18:39栏目:人才招聘
TAG:

前端基础进阶(二):执行上下文详细图解

2017/02/21 · 基础技术 · 执行上下文

原文出处: 波同学   

图片 1

先随便放张图

我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题。比如先来一个简单一点的。

JavaScript

console.log(a); // 这里会打印出什么? var a = 20;

1
2
console.log(a);   // 这里会打印出什么?
var a = 20;

暂时先不管这个例子,我们先引入一个JavaScript中最基础,但同时也是最重要的一个概念执行上下文(Execution Context)

每次当控制器转到可执行代码的时候,就会进入一个执行上下文。执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。JavaScript中的运行环境大概包括三种情况。

  • 全局环境:JavaScript代码运行起来会首先进入该环境
  • 函数环境:当函数被调用执行时,会进入当前函数中执行代码
  • eval

因此在一个JavaScript程序中,必定会产生多个执行上下文,在我的上一篇文章中也有提到,JavaScript引擎会以堆栈的方式来处理它们,这个堆栈,我们称其为函数调用栈(call stack)。栈底永远都是全局上下文,而栈顶就是当前正在执行的上下文。

当代码在执行过程中,遇到以上三种情况,都会生成一个执行上下文,放入栈中,而处于栈顶的上下文执行完毕之后,就会自动出栈。为了更加清晰的理解这个过程,根据下面的例子,结合图示给大家展示。

JavaScript

var color = 'blue'; function changeColor() { var anotherColor = 'red'; function swapColors() { var tempColor = anotherColor; anotherColor = color; color = tempColor; } swapColors(); } changeColor();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var color = 'blue';
 
function changeColor() {
    var anotherColor = 'red';
 
    function swapColors() {
        var tempColor = anotherColor;
        anotherColor = color;
        color = tempColor;
    }
 
    swapColors();
}
 
changeColor();

我们用ECStack来表示处理执行上下文组的堆栈。我们很容易知道,第一步,首先是全局上下文入栈。

图片 2

第一步:全局上下文入栈

全局上下文入栈之后,其中的可执行代码开始执行,直到遇到了changeColor(),这一句激活函数changeColor创建它自己的执行上下文,因此第二步就是changeColor的执行上下文入栈。

图片 3

第二步:changeColor的执行上下文入栈

changeColor的上下文入栈之后,控制器开始执行其中的可执行代码,遇到swapColors()之后又激活了一个执行上下文。因此第三步是swapColors的执行上下文入栈。

图片 4

第三步:swapColors的执行上下文入栈

在swapColors的可执行代码中,再没有遇到其他能生成执行上下文的情况,因此这段代码顺利执行完毕,swapColors的上下文从栈中弹出。

图片 5

第四步:swapColors的执行上下文出栈

swapColors的执行上下文弹出之后,继续执行changeColor的可执行代码,也没有再遇到其他执行上下文,顺利执行完毕之后弹出。这样,ECStack中就只身下全局上下文了。

图片 6

第五步:changeColor的执行上下文出栈

全局上下文在浏览器窗口关闭后出栈。

注意:函数中,遇到return能直接终止可执行代码的执行,因此会直接将当前上下文弹出栈。

图片 7

整个过程

详细了解了这个过程之后,我们就可以对执行上下文总结一些结论了。

  • 单线程
  • 同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待
  • 全局上下文只有唯一的一个,它在浏览器关闭时出栈
  • 函数的执行上下文的个数没有限制
  • 每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此。

为了巩固一下执行上下文的理解,我们再来绘制一个例子的演变过程,这是一个简单的闭包例子。

JavaScript

function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999

1
2
3
4
5
6
7
8
9
function f1(){
    var n=999;
    function f2(){
        alert(n);
    }
    return f2;
}
var result=f1();
result(); // 999

因为f1中的函数f2在f1的可执行代码中,并没有被调用执行,因此执行f1时,f2不会创建新的上下文,而直到result执行时,才创建了一个新的。具体演变过程如下。

图片 8

上例演变过程

下一篇文章继续总结执行上下文的创建过程与变量对象,求持续关注与点赞,谢谢大家。

前端基础进阶系列目录

前端基础进阶系列我会持续更新,欢迎大家关注我公众号isreact,新的文章更新了我会在公众号里第一时间通知大家。也欢迎大家来简书关注我。

1 赞 2 收藏 评论

图片 9

如何通过 Vue+Webpack 来做通用的前端组件化架构设计

2016/07/12 · JavaScript · 1 评论 · 前端框架

本文作者: 伯乐在线 - 新空气 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

目录:

  1. 架构选型

    2. 架构目录介绍

    3. 架构说明

    4. 招聘消息

 

目前如果要说比较流行的前端架构哪家强,屈指可数:reactjsangularjsemberjsavalonjsvuejs

我个人接触使用过:avalonjsangularjsvuejs。因为工作以及前端团队能力的问题,所以在不同的公司,在开发工作中选用了不同的前端架构。

以下仅仅是代表我个人选用架构的一些看法和理由,如下:

angular:

我觉得angularjs的学习上手周期比较长,可能遇到问题,都无法立刻解决,而且编码的质量明显的很差,如果团队没有制定规范,那写出来的代码就没法看。对于一个选用angularjs的团队来说,我认为编码规范是很重要的,否则对编码能力是没有提升的。

avalon:

avalonjs文档资料没有那么全,我感觉一些开源支持的力量不够多。不过,如果有项目需求,需要去做IE浏览器的支持话,我建议选择avalonjs

vue:

vuejs 文档比较齐全,vue吸取了angularjs 的一些优点,规避了一些缺点,至少编码规范上有了一个质的飞跃,学习上手的周期比较短。vue起初只是一个轻量级的类库,用来做类似于react的事情,同时vue也是可以拿来做前端架构设计的,比如:vueify

  • vue-router(spa框架)。

vue学习地址:http://cn.vuejs.org/

 

以上说了那么多没用的,下面就来点干活了!

我的前端组件化架构设计,目录如下:

图片 10

项目架构用到的知识点,还是挺多的,知识清单如下:

[1]:   gulp + webpack 构建打包工具, 使用了一系列的loader,比如:vue-loader,  sass-loader, babel-loader , 以及 postcss,postcss-custom-properties,等等

[2]  :   postcss-custom-properties : 用来做样式全局化, 只需要通过变量去维护,通过编译变量既可以换肤。

 [3]  :   vue-loader (vue文件组件化):用来去编译处理 *.vue 的文件,一个vue 文件就是一个单独的组件,vue组件开发具有高独立且易维护。组件的划分可大可小,一个页面也可以看作成由多个vue 组件构成的,一个页面也可以是一个vue组件, vue 文件结构如下:

图片 11

[4]  : babel-loader  :实现对vue文件中 es6 语法的编译解析

 [5]  : vue-router :用来做路由分发,而且文档非常的齐全(学习地址:)。

 [6]  : vue (插件式方式):vue本身提供了一个install 方式用来注入,我们可以注入一些全局的(属性、方法、以及通用的ui组件)。

下面说说文件夹的含义:

  common 文件夹: 是用来存一些通用的东西,比如样式,以及全局的js等等

  components 文件夹:用来放独立的组件,我打算后期做细分,ui 组件,以及page 组件等等,这里面就是团队的心血,以后就能做成独立的组件库了。

  filters 文件夹:用来放通用的过滤器操作。

  plugins 文件夹:用来放 Vue.use 注入到Vue全局的插件库,比如:请求加载、弹框、分页、ui组件 等等。plugins 只是把 componets组件暴露给 Vue全局。

  views 文件夹: 用来存放页面模块

  app.vue 文件:第一次启动的主程序模块

  app.js 文件:启动前的加载,注入,实例化

  router.config.js 文件:路由模块

 

目前该架构在前后台的SPA架构都适用,可能还是有很多不完善,不过我还很年轻,vue也还狠年轻,望各位道友多给我们年轻人一些机会。

2 赞 6 收藏 1 评论

轻松学习 JavaScript (4):函数中的 arguments 对象

2017/11/11 · JavaScript · arguments

原文出处: Dhananjay Kumar   译文出处:码农网 – 小峰   

JavaScript函数具有像数组一样的对象,这些对象称为arguments,与传递给函数的参数相对应。传递给JavaScript函数的所有参数都可以使用arguments对象来引用。

现在我们开始学习,仔细看下面列出的代码:

function add(num1, num2) { var res = num1 + num2; return res; } var r = add(7, 8); console.log(r);

1
2
3
4
5
6
function add(num1, num2) {
    var res = num1 + num2;
    return res;
}
var r = add(7, 8);
console.log(r);

在上面的函数中,num1和num2是两个参数。你可以使用名为num1和num2的arguments来引用这些参数。除了arguments名称之外,你还可以使用JavaScript数组,如对象arguments来引用它们。所以,上面的函数可以重写,如下所示:

function add(num1, num2) { var res = arguments[0] + arguments[1]; return res; } var r = add(7, 8); console.log(r);

1
2
3
4
5
6
function add(num1, num2) {
    var res = arguments[0] + arguments[1];
    return res;
}
var r = add(7, 8);
console.log(r);

在JavaScript函数中,arguments对象用于访问或引用传递给函数的所有参数。arguments对象是可用于函数的局部变量。arguments对象的长度相当于传递给函数的arguments数量。请看下面的代码,作为输出将得到2,因为有两个arguments传递给函数:

function add(num1, num2) { var res = arguments.length; return res; } var r = add(7, 8); console.log(r);

1
2
3
4
5
6
function add(num1, num2) {
    var res = arguments.length;
    return res;
}
var r = add(7, 8);
console.log(r);

关于作者:新空气

图片 12

简介还没来得及写 :) 个人主页 · 我的文章 · 3

图片 13

arguments对象不是纯数组

JavaScript的arguments对象不是纯粹的JavaScript数组。你不能对arguments对象执行诸如push,pop,slice等操作。正如你将在下面列出的代码中所看到的那样,执行push操作会引发异常,因为arguments.push不是函数。

function add(num1, num2) { arguments.push(78); var res = num1 + num2; return res; }

1
2
3
4
5
function add(num1, num2) {
    arguments.push(78);
    var res = num1 + num2;
    return res;
}

版权声明:本文由ag真人发布于人才招聘,转载请注明出处:前端基础进阶,来做通用的前端组件化架构设计