title: 8th Day
date: 2017-07-17 14:25:35

tags: [daily]

成为唯一标识符

1
2
3
4
5
6
7
8
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
var myID = "static" + guid();
console.log(myID)
  • 调用这段代码即可生成一组特殊的标识符作为ID

读取文件

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
var fs = require('fs'),
util = require('util'),
path = 'F:/NW';
function explorer(path){
fs.readdir(path, function(err, files){
//err 为错误 , files 文件名列表包含文件夹与文件
if(err){
console.log('error:\n' + err);
return;
}
files.forEach(function(file){
fs.stat(path + '/' + file, function(err, stat){
if(err){console.log(err); return;}
if(stat.isDirectory()){
// 如果是文件夹遍历
explorer(path + '/' + file);
}else{
// 读出所有的文件
console.log('文件名:' + path + '/' + file);
}
});
});
});
}
explorer(path);

词法作用域

  • 即代码在编写过程中体现出来的范围

作用域链

  • 一个函数里可能有带有很多个函数,作用域链就是在这个基本上形成
  • 一个函数至少有一个作用域,就是全局作用域,一个简单带有return的函数就是一个例子
  • 当在函数中寻找变量,是从当前位置开始找,直到遇到这个变量的作用域,不管函数外面有没有这个变量的全局作用域,如果最后还没有就是undefined
  • 同级的链不可混合查找
1
2
3
4
5
6
7
8
9
function say0to4(){
var i = 0;
for (;i < 5; i++){
setTimeout(() => {
console.log(i);
}, i * 100);
}
}
say0to4();
  • 因为存在异步,所以循环会先走完才执行console

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function say0to4(){
    var i = 0;
    for (;i < 5; i++){
    (function f(the_i){
    setTimeout(() => {
    console.log(the_i);
    }, the_i * 100);
    })(i)
    }
    }
    say0to4();
  • 利用词法作用域来解决这个问题,将setTimeout写进函数里,每次执行循环都把i传入函数f,每次都执行异步,这样就可以避免在循环走完了才走回调函数

this

  • 函数中有this,如果直接调用这个函数,此时的this就是Global(undefined)
  • 这个函数被某个函数调用了,此时的this就是调用的这个函数
1
2
3
4
5
6
7
8
9
function c(n,a){
this.name = n;
this.age = a;
}
var D = new c('Lin','21');
D.name //Lin
D.age //21
  • 这是创建了一个对象D,new相当于让D创建了一个空对象,调用了c函数,此时c的this是D,所以将参数传到this.name和this.age,就相当于在D的空对象中创建了name,和age,并有了参数
  • 用这种方法,即使函数c中return了另外的东西也不影响D对象中的属性和参数
1
2
3
4
5
6
7
8
9
function c(n,a){
var name = n;
var age = a;
}
var D = new c('Lin','21');
D.name //undefined
D.age //undefined
  • 这样操作即使是创建了D的新空对象,但函数c没有在空对象里创建属性和传入参数