JavaScript的变量提升及作用域

JavaScript的语法简直不要太灵活,灵活到导出是坑,甚至有人说JavaScript语言不够成熟。。

Code once,debug everywhere.

下面简单整理下常见的坑坑。

变量提升(hoisting)

阅读全文 »

2017_12-第二周

1
var a = a || {}

👆等价于👇

1
2
3
4
var a;
function(a){
if(a === 0 || a === "" || a === false || a === null || a === undefined) a = {}
}

在之前固有的印象中,逻辑与&&和逻辑或||都是出现在if条件语句中,一般用来做判断条件使用,if()括号中会依据a==1 || b!=1表达式的返回值trueorfalse来做判断。👇

阅读全文 »

Javascript 面向对象编程(一):封装

最近一直在用百度的echarts做图表什么的,在配置项中的option是一个对象,,like this var option = {},,有时需要多个option对象,复制来复制去,也只是复制的变量,指向的还是同一个引用。。得好好学习下,翻来覆去还是阮一峰老师的总结最友好~


原文链接:Javascript 面向对象编程(一):封装 - by 阮一峰

学习Javascript,最难的地方是什么?
我觉得,Object(对象)最难。因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握。
下面就是我的学习笔记,希望对大家学习这个部分有所帮助。我主要参考了以下两本书籍:

阅读全文 »

2017-12-04

  • 幂等idempotent idempotence 是一个数学与计算机学概念,常见于抽象代数中。
    在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现.

  • scaffold 英[ˈskæfəʊld] 美[ˈskæfoʊld]
    n. 脚手架; <史>断头台;
    [例句]Moore ascended the scaffold and addressed the executioner.
    穆尔走上断头台,和刽子手说话。

2017-12-05

  • stumbled 英 [ˈstʌmbl] 美 [ˈstʌmbəl]
    v. (不顺畅地) 说( stumble的过去式和过去分词 ); 跌跌撞撞地走; 绊脚; (说话、演奏等) 出错;
    [例句]She stumbled and fell, scraping her palms and knees.
    她绊了一下摔倒了,手掌和膝盖都蹭破了。

  • *reserved 英[rɪˈzɜ:vd] 美[rɪˈzɜ:rvd]
    adj. 预订的; 矜持的; 储藏着的;
    v. 保留[储备]某物( reserve的过去式);
    [例句]He was unemotional, quite quiet, and reserved
    他感情淡漠,沉默寡言,性格内敛。

  • keyword 关键字
    reserved word 保留字

  • literal 英[ˈlɪtərəl] 美[ˈlɪtərəl]
    adj. 照字面的; 原义的; 逐字的; 平实的,避免夸张;
    n. [印] 错排,文字上的错误;
    [例句]In many cases, the people there are fighting, in a literal sense, for their homes.
    很多情况下,那里的人们是真刀真枪地在为家园而抗争。

  • anonymous 英[əˈnɒnɪməs] 美[əˈnɑ:nɪməs]
    adj. 匿名的; 无名的; 假名的; 没有特色的;
    [例句]You can remain anonymous if you wish
    你愿意的话可以不透露姓名。

2017-12-07

阅读全文 »

立即执行函数表达式(IIFE)

原文:Immediately-Invoked Function Expression (IIFE) by Ben Alman

以防你没有注意到,(事先声明)我是一个对于专业术语有些坚持的人。所以,当我多次听到流行却易产生误解的术语「自执行匿名函数」,最终决定将的想法总结到这篇文章中。

除此之外,为了提供一些更深入更彻底的关于这种模式是如何工作的,事实上我还建议了我们应该怎样称呼这种模式。另外,如果你想跳过这里,你可以直接阅读立即调用函数表达式,但是我建议你读完整篇文章。

你需要知道的是,这篇文章不是想说「我是对了,你是错的」之类的。我发自真心地想帮助人们理解这有点儿复杂的概念,并且我认为使用前后一致的精确术语是有助于人们理解的最简单的方式之一。

阅读全文 »

理解与使用Javascript中的回调函数

有点小感慨

在这不得不提一下Python,在人工智能火起来之前就在断断续续的看教程。现在因为人工智能的原因,更要好好学习一下,,在学习的过程中了,第一次好像明白『函数式编程』到底是怎么一回事儿了。放张图,各位体会下,,👇
编程语言的抽象层次
因为最近工作的原因,先后遇到了几个关于js的问题,没想到需要阅读的Tab页越来越多,需要总结的页是越来越多。这个过程中,没想到朝夕相处的js中也有类似的特性,,比如闭包,之前特地去了解,可还是半知半解,,如今从Python反观js,一下子通透了~哈哈,下面进入正文


Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回。

阅读全文 »

孔雀为什么开屏呢?

好像突然明白了老祖宗强调的『成家立业』,成家在前,立业在后。稳定的伴侣对人类这种有性生殖的动物来说,无疑是重中之重。
宏观一点讲,人的一生可以分为这几个阶段:

  1. 生长发育至性成熟
  2. 寻找配偶
  3. 交配产子
  4. 抚养后代至性成熟

感情稳定的人儿可以将更多的精力放在家庭和事业上。而那些,那些单身呢??不仅需要全局tigger去监听意中人的出现事件,还要轮询这个对象到底是不是意中人。前者是占用的资源是隐性的,是生理驱动的,,后者是显性的,甚至在某一时间段是同步且阻塞的。

试想一下,,你正在工作,忽然后客人来访,余光扫到这个对象,,

阅读全文 »

JavaScript:彻底理解同步、异步和事件循环(Event Loop)

为什么JavaScript是单线程?

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?所以,渲染DOM的线程和JavaScript执行的线程一定是互斥的。
 
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

虽然JS是单线程的但是浏览器的内核是多线程的,在浏览器的内核中不同的异步操作由不同的浏览器内核模块调度执行,异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含上图中的3种 webAPI,分别是 DOM Binding、network、timer模块。

阅读全文 »

JavaScript执行顺序

JavaScript(以下简称js) 是一种描述型脚本语言,由浏览器进行动态的解析与执行。由于js编写位置比较灵活,所以处在不同位置的js代码执行顺序也是不同的。js和其他编程语言相比比较随意,所以js代码中充满各种奇葩的写法。苦逼的公司造就苦逼程序员全栈工程师,工作中总是经常自己写些简单的前端页面,经常被js的执行顺序袭扰,索性找个大块儿时间好好学习总结下,理解各型各色的写法,希望能对js的语言特性有深入的理解。

函数的声明和调用

函数的定义方式大体有以下两种,浏览器对于不同的方式有不同的解析顺序。

  1. 使用function关键字声明一个函数,再指定一个函数名,叫函数声明
    1
    2
    3
    function Fn1(){ 
    alert("Hello World!");
    }
  2. 使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
    1
    2
    3
    var Fn2 = function(){ 
    alert("Hello World!");
    }
    如果遇到函数声明,则进行预处理(类似C语言的编译);如果遇到函数表达式,则只是将函数赋值给一个变量,不进行预处理,待调用的时候再进行处理。
    @(#函数声明)
    1
    2
    3
    4
    Fn1();
    function Fn1(){
    alert("Hello World!");
    }
    👆↑ 这段代码()可以正常运行,弹出”Hello World!”警告对话框。浏览器对Fn1()进行了预处理,再从Fn1();开始运行。
阅读全文 »

TCP重传机制

TCP要保证所有的数据包都可以到达,所以,必需要有重传机制。

注意,接收端给发送端的ACK只会确认最后一个连续的包。比如,发送端发了#1,#2,#3,#4,#5一共五份数据,接收端收到了#1,#2,于是返回ACK=3,然后收到了#4(#3未收到),此时的TCP会怎么办?我们要知道,seqACK是以字节数为单位,所以返回ack的时候,不能跳着确认,只能确认最大的连续收到的包,不然,发送端就以为之前的都收到了。

超时重传机制

一种是不返回ack,死等#3,当发送方发现收不到#3的ack超时后,会重传#3。一旦接收方收到#3后,会ack返回4——意味着#3和#4都收到了。

阅读全文 »
0%