yygmind


  • Home

  • Categories

  • Archives

  • Tags

  • Search

You Don't Know JS上卷Part1 Chapter3.函数作用域和块作用域

Posted on 2018-06-15   |   In 前端 , JS   |     |   visitors

3.1 函数中的作用域

属于这个函数的全部变量都可以在整个函数的范围内使用及复用(事实上在嵌套的作用域中也可以使用)。

1
2
3
4
5
6
7
8
9
10
11
12
13
function foo(a) {
var b = 2;

// 一些代码

function bar() {
// ...
}

// 更多的代码

var c = 3;
}

foo(..)作用域中包含了标识符(变量、函数)a、b、c和bar。无论标识符声明出现在作用域中的何处,这个标识符所代表的变量或函数都将附属于所处的作用域。

全局作用域只包含一个标识符:foo。

3.2 隐藏内部实现

最小特权原则(最小授权或最小暴露原则):在软件设计中,应该最小限度地暴露必要内容,而将其他内容都”隐藏“起来,比如某个模块或对象的API设计。

1
2
3
4
5
6
7
8
9
10
11
12
13
function doSomething(a) {
function doSomethingElse(a) {
return a - 1;
}

var b;

b = a + doSomethingElse( a * 2 );

console.log( b * 3 );
}

doSomething( 2 ); // 15

b和doSomethingElse(..)都无法从外部被访问,而只能被doSomething(..)所控制,设计上将具体内容私有化了。

Read more »

You Don't Know JS上卷Part1 Chapter2.词法作用域

Posted on 2018-06-09   |   In 前端 , JS   |     |   visitors

2.1 词法阶段

词法作用域是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的,所以在词法分析器处理代码时会保持作用域不变。(不考虑欺骗词法作用域情况下)

2.1.1 查找
  • 作用域查找会在找到第一个匹配的标识符时停止。

  • 遮蔽效应:在多层嵌套作用域中可以定义同名的标识符,内部的标识符会“遮蔽”外部的标识符。

  • 全局变量会自动变成全局对象的属性,可以间接的通过对全局对象属性的引用来访问。通过这种技术可以访问那些被同名变量所遮蔽的全局变量,但是非全局的变量如果被遮蔽了,无论如何都无法被访问到。

    1
    window.a
  • 词法作用域只由函数被声明时所处的位置决定。

  • 词法作用域查找只会查找一级标识符,比如a、b、c。对于foo.bar.baz,词法作用域只会查找foo标识符,找到之后,对象属性访问规则会分别接管对bar和baz属性的访问。

Read more »

You Don't Know JS上卷Part1 Chapter1.作用域是什么

Posted on 2018-06-02   |   In 前端 , JS   |     |   visitors

第1章 作用域是什么

  • 问题1:变量储存在哪里?
  • 问题2:程序需要时如何找到它们?

1.1 编译原理

JavaScript语言是“动态”或“解释执行”语言,但事实上是一门编译语言。但它不是提前编译的,编译结果也不能在分布式系统中移植。

传统编译语言流程中,程序在执行之前会经历三个步骤,统称为“编译”。

  • 分词/词法分析(Tokenizing/Lexing)

    将由字符组成的字符串分解成(对编程语言来说)有意义的代码块。

    1
    var a = 2;

    上面这段程序会被分解成以下词法单元:var、a、=、2、;。

    空格是否会被当做词法单元,取决于空格在这门语言中是否有意义。

  • 解析/语法分析(Parsing)

    将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的数。这个数被称作抽象语法树(Abstract Syntax Tree, AST)。

    1
    var a = 2;

    以上代码的抽象语法树如下所示:

    • VariableDeclaration 顶级节点
      • Identifier 子节点,值为a
      • AssignmentExpression 子节点
        • NumericLiteral 子节点,字为2
  • 代码生成

    将AST转换成可执行代码的过程。过程与语言、目标平台等相关。

    简单来说就是可以通过某种方法将var a = 2;的AST转化为一组机器指令。用来创建一个叫做a的变量(包括分配内存等),并将一个值存储在a中。

Read more »

RecyclerView调节项目间间距大小

Posted on 2017-02-10   |   In Android   |     |   visitors

调用处直接调用

1
2
3
//设置item之间的间隔
SpacesItemDecoration decoration = new SpacesItemDecoration(8);
recyclerView.addItemDecoration(decoration);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class SpacesItemDecoration extends RecyclerView.ItemDecoration {

private int space;
private StaggeredGridLayoutManager.LayoutParams lp;

public SpacesItemDecoration(int space) {
this.space = space;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

int position = parent.getChildAdapterPosition(view);
lp = (StaggeredGridLayoutManager.LayoutParams)view.getLayoutParams();
if (position == 0 || position==1){
outRect.top = space * 2;
} else {
outRect.top = space;
}

if (lp.getSpanIndex() == 0) {
outRect.left = space * 2;
outRect.right = space;
} else {
outRect.left = space;
outRect.right = space * 2;
}
outRect.bottom = space;

//注掉的方法总有漏网之鱼,不知为啥
// outRect.left = space;
// outRect.right = space;
// outRect.bottom = space;
// if (position == 0 || position == 1) {
// //用于设置第一行跟顶部的距离
// outRect.top = space;
// }
//
// if (lp.getSpanIndex() == 0) {
// //用于设同行两个间隔间跟其距离左右屏幕间隔相同
// outRect.right = 0;
// }
}
}

每周TODO知识点总结 第一期

Posted on 2016-11-27   |   In 每周TODO   |     |   visitors

Java基础相关

1、正则表达式里,字符串“*”写成“\\*”,“\”写成“\\\\”,为什么?

  • 注意以下两点:

    • 1.字符串里面表示斜杠就需要两个斜杠如“\\”
    • 2.正则表达式里的斜杠需要转意,是用“\”标示。
  • 所以对于“\\\\”,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠是转义符,第四个斜杠是斜杠本身。这样就成了4个斜杠在正则表达式里面表示一个斜杠。

  • 更多知识点:

    • 引用说明:有正斜杠与反斜杠之分,正斜杠,一般就叫做斜杠,符号为“/”;反斜杠的符号为“\”。斜杠(/)在JAVA中没有什么特别的意义,就是代表一个字符‘/’;
    • 反斜杠(\)则不然,它和紧跟着它的那个字符构成转义字符,如“\n”(表示换行)、“\””(表示字符‘”’)等,所以在字符串中要表示字符’\’要用“\\”来表示,例:如果你这样定义一个字符串String s = “name\sex”是错误的,要这样定义String s = “name\\sex”;
Read more »

Android 动态绘制圆形进度条

Posted on 2016-10-30   |   In Android   |     |   visitors

效果图

此处输入图片的描述

实现思路

  • 在画布上直接绘制View,需要了解一下几点
    • 1.需要画一个底层小圆和上层大圆
    • 2.圆圈上有不同进度的颜色
    • 3.颜色的变化规律是先慢慢变多再慢慢减少
Read more »

React Native环境配置血泪爬坑

Posted on 2016-10-29   |   In Android , React-Native   |     |   visitors

1.下载gradle文件超时

进入AwesomeProject目录,\$ cd AwesomeProject,然后在AwesomeProject目录下运行\$ react-native run-android,就会构建工程并自动安装到你的模拟器或者设备,同时启动用于实现动态代码加载的Node服务。第一次运行的时候,会下载gradle文件,然而在我们的办公网络环境运行就会报下面的错:ConnectException

Read more »

Scala Cookbook读书笔记 Chapter 5.Methods 第一部分

Posted on 2016-10-13   |   In Scala   |     |   visitors

5.0 本章概述

  • Java和Scala定义简单method区别:

    // java
    public String doSomething(int x) {
        // code here
    }
    
    // scala
    def doSomething(x: Int): String = {
        // code here
    }
    
  • Scala还可以使用下面方式,不指定返回值类型,不要求包裹body的大括号:

    def plusOne(i: Int) = i + 1
    
  • 除了上面例子的区别,Java和Scala还包括以下不同:
    • 指定方法获取控制(显示)
    • 给方法参数设置默认值的能力
    • 调用方法时指定方法参数名字的能力
    • 如何声明一个方法可能抛出的异常
    • 方法里使用可变参数

Read more »

Cookbook读书笔记 Chapter 4.Classes and Properties 第二部分

Posted on 2016-09-29   |   In Scala   |     |   visitors

4.8 分配块或函数给字段

  • 使用代码块或者调用一个函数初始化类里的字段

    4.8.1 解决方案

  • 设置字段等于需要的代码块或者函数

    class Foo {
    
        // set 'text' equal to the result of the block of code
        val text = {
            var lines = ""
            try {
                lines = io.Source.fromFile("/etc/passwd").getLines.mkString
            } catch {
                case e: Exception => lines = "Error happened"
            }
            lines
            }
            println(text)
    }
    
    object Test extends App {
        val f = new Foo
    }
    
Read more »

Scala Cookbook读书笔记 Chapter 4.Classes and Properties 第一部分

Posted on 2016-09-27   |   In Scala   |     |   visitors

4.0 本章概述

  • 尽管Scala和Java有很多相同点,但是类的声明,类构造函数和字段可见控制是两者之间最大的不同。Java是更加冗长,Scala是更加简洁。

4.1 创建主构造函数

  • 问题:创建主构造函数和Java不同

    4.1.1 解决方案

  • Scala的主构造函数由下面几部分组成:
    • 构造器参数
    • 类的主体部分被调用的方法
    • 类的主体部分执行的语句和表达式
  • Scala类主体部分声明的字段处理方式和Java相似,它们在类第一次实例化时被赋值。

    class Person(var firstName: String, var lastName: String) {
    
        println("the constructor begins")
    
        // some class fields
        private val HOME = System.getProperty("user.home")
        var age = 0
    
        // some methods
        override def toString = s"$firstName $lastName is $age years old"
        def printHome { println(s"HOME = $HOME") }
        def printFullName { println(this) } // uses toString
    
        printHome
        printFullName
        println("still in the constructor")
    }
    
Read more »
1234
yygmind

yygmind

To obsess or to die

34 posts
10 categories
30 tags
github zhihu csdn
© 2016 - 2018 yygmind
Powered by Hexo
Theme - NexT.Muse