0%

看了冴羽的文章“JavaScript深入之从ECMAScript规范解读this”,决定读一读this的规范定义,梳理一下this。

this存在的场景

this存在的场景肯定是函数执行的时候,那么有以下几种调用函数的方式:

  1. 直接调用:foo()foothis的值将会是windowundeifined,取决于是否是严格模式。
  2. 作为对象的方法调用:obj.foo()this的值将是obj
  3. 作为new操作符的一部分调用:new foo()
  4. 通过applycallbind调用:this的值将被绑定为指定值。

然而,有特殊情况的存在:

Read more »

看了冴羽的Javscript博客,同样模拟一下new的功能实现

对于new操作符的认识

首先,是使用new的两种方式:

1
2
3
function Person(name) {this.name = name};
const person1 = new Person // person1.name === undefined
const person2 = new Person('Siro'); // person2.name === 'Siro'

其次,简单看一下new的大致流程:

Read more »

此文为关于JS中对象的笔记。

ECMA-26对于对象的定义:

In ECMAScript, the state and methods are carried by objects, while
structure, behaviour, and state are all inherited.

高程(中文版):“无序属性的集合,其属性可以包含基本值、对象或者函数。”

简而言之,在Ecmascript中:对象是键值对(key-value)的集合

对象属性的特性(attribute)

对象的属性有两种:

  1. 数据属性。
  2. 访问器属性。通过getter和setter取值和赋值。
Read more »

很久很久以前,在适配移动端的时候,第一次听到viewport这个概念。

只知道一股脑儿复制:

当时不知道是什么意思,查了几篇文章后未果。

近期好好读了远古时期介绍viewport的博客,准备对这个概念做一个梳理。

博客文章地址:A tale of two viewports — 1

没有找出关于viewport的标准定义,以下内容是结合了该博客viewport概念系列的一家之见。

Read more »

补一补CSS基础,从line-height开始。

line-height到底指什么

line-height可以粗略认为是:

  1. 由行内级元素组成内容的块状元素的最小的高度。
  2. 行内元素(non-replaced inline elements)中用来计算line-box的高度的值。

line-box根据定义是:

The rectangular area that contains the boxes that form a line is called a line box.

包含着组成一行的框(boxes)的矩形区域。

而这些框(boxes)则是行内级(inline-level elements)元素产生的,所以可以看成这个line-box里包含了许多的行内级元素,行内级元素即display属性为:

  1. inline
  2. inline-block
  3. inline-table

的元素。

需要详细说明,挖个坑。

line-height的值

Read more »

简单总结一下JS中的部分显/隐式强制类型转换。

1、类型

JS中6种基本类型:

Undefined, Null, Boolean, Number, Symbol, or String

以及对象:

member of the type Object

Boolean的真假值

Read more »

这里是一个笨蛋学习实现Promise的记录。

为什么使用Promise?

换句话说,promise的好处:

  1. 缓解回调地狱的问题,使得代码易于维护,提升开发效率,降低维护难度。

此处应有对比的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 如果使用回调,会像这样子,嵌套一层又一层的异步
* 如果处理错误,可能要写if...else...
*/
asyncCall('hello', (err, data) => {
if(err) {
//do something here
}
asyncCall2('hello', (err, data) => {
if(err) {
//do something here
}
asyncCall3('hello', (err, data) => {
if(err) {
//do something here
}
asyncCall4('hello', cb)
})
})
})

Promise如何使用?

Promise的实现过程

第一步,捋清思路

第二步,实现它!

第三步,测试它!

参考

  1. 5 Reasons Why You Should Be Using Promises

本文是阅读你不知道的JS(上)-原型部分所做的笔记。

原型与原型链

ECMA-262对于原型的定义(prototype):

object that provides shared properties for other objects

  1. 函数都有一个prototype属性。
  2. 对象一般都有一个[[prototype]]属性,可以通过[[prototype]]访问另一个对象,从而把对象和对象串联起来。
  3. 可通过new调用一个函数,使返回对象的[[prototype]]和此函数的prototype建立关联。
  4. 访问一个对象的属性/方法时,若未在此对象上找到对应的属性/方法,将会沿着原型链一直往上查找,即通过[[prototype]]查找,直到查找到对应的属性/方法;反之最后会查找到null,返回undefined
Read more »