node.js笔记–前言
附录
在nodejs中可能用到的稍微复杂的语言特性
作用域
它决定了变量的可见范围和生命周期,可以减少命名冲突,而且是垃圾回收的基本单元,JavaScript的作用域不是以花括号包围的块级作用域,例如,下列语句是完全合法的:
if(true){
var somevar = 'value';
}
console.log(somevar);
这是因为JavaScript的作用域是由函数来决定的,if、for语句中的花括号不是独立的作用域
在一个函数中定义的变量只对这个函数内部可见,JavaScript会先搜索当前函数作用域,或者成为局部作用域,如果没有则搜索上层作用域,一直到全局作用域
var scope = 1;
var f = function(){
console.log(scope);
var scope = 'f';
}
f();
没有输出global,而是undefined,这是JavaScript的一个特性,按照作用域搜索顺序,在console.log函数访问scope变量时,JavaScript会搜索函数f的作用域,恰巧在f作用域里搜索到scope变量,所以上层作用域中定义的scope就被屏蔽了,但执行时候scope还没被定义,或者说初始化,所以得到的就是undefined值了
函数作用域的嵌套
var f = function(){
var scope = 'f0'
(function(){
var scope = 'f1';
(function(){
console.log(scope);
})();
})();
};
f();
在最内层函数引用了scope变量,通过作用域搜索,找到了父作用域中定义的scope变量
* 注意:函数作用域的嵌套关系是定义时决定的,而不是调用时决定的
var scope = 'top';
var f1 = function(){
console.log(scope);
};
f1();
var f2 = function(){
var scope = 'f2';
f1();
};
f2();
在这个例子中,通过f2调用的f1在查找scope定义时,找到的是父作用域定义的scope变量,而不是f2定义的scope变量,这说明了作用域的嵌套关系不是在调用时确定的,而是在定义时确定的。
A.1.2 全局作用域
全局对象在Node.js对应的是global对象,在浏览器中对应的是window对象
又称全局作用域
闭包
定义:由函数及其封闭的自由变量组成的集合体
eg:
var generate = function(){
var count = 0;
var get = function(){
count++;
return count;
};
return get;
};
var counter = generate();
console.log(counter());
console.log(counter());
console.log(counter());
闭包的用途
1、实现嵌套的回调函数
2、隐藏对象的细节
可以把一个对象用闭包封装起来,只返回一个“访问器”的对象,即可实现对细节隐藏
对象
Javascript只有对象,对象就是对象,不是类的实例
创建和访问
可通过构造函数来创建复杂的对象
function User(name,uri){
this.name = name;
this.uri = uri;
this.display = function(){
console.log(this.name);
}
}
var someuser = new User('byvoid','http://www.baidu.com');
上下文对象
上下文对象就是this指针,即被调用函数所处的环境,作用是在一个函数内部引用调用它的对象本身,包括全局对象
1、call 和 apply
call和apply的功能是以不同的对象作为上下文来调用某个函数,call可以用于实现对象的继承,call和apply的功能是一致的,
二者的语法分别是:
func.call(thisArg[,arg1[,arg2[,...]]])
func.apply(thisArg[,argsArray])
eg
var usr = {
name:'dys',
display:function(words){
console.log(this.name + ' says ' + words);
}
};
var foo = {
name: 'foobar'
};
usr.display.call(foo,'hello');
2、bind
可以使用bind方法来永久绑定函数的上下文,使其无论被谁调用,上下文都是固定的
bind的语法为func.bind(thisArg[,arg1[,arg2[,...]]])
原型
function Person(){
}
Person.prototype.name = 'BYVoid';
Person.prototype.showName = function(){
console.log(this.name);
};
var person = new Person();
person.showName();
原型链:
Object和Function,它们都是构造函数,用于生成对象,Object.prototype是所有对象的祖先,Function.prototype是所有函数的原型