最近两本书 读书笔记(2)
前言
明天去考安全师的证-0-这段时间都在忙这个,今天终于有点时间来继续总结上次未总结的内容。
模块
仔细看下面这段代码
function Module(){
var something = "linshui";
var other = "zhaoying";
function A(){
console.log(something);
}
function B(){
console.log(other);
}
return{
A:A,
B:B
};
}
var c = Module();
c.A(); //linshui
c.B(); //zhaoying
Module() 返回一个对象字面量语法{key:value} 来表示对象
这个返回的对象不是对内部数据变量的引用,而是对内部函数
的引用。
保持内部数据变量的隐藏而且私有。
可以将这个返回值看做本质上是模块的公共API。
这样可以联系自己以前所学到的工厂模式打造API中转站。而且可以结合node.js里创建函数的 exports 对象。利用方式各种各样,建议去github找些优秀的项目去模仿学习。
模块模式需要两个必要条件:
1.必须有外部的封闭函数,而且该函数至少被调用一次。(每次调用会创建一个新的模块实例)
2.封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态。
记住并理解下面这句话
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
补充
无论通过何种手段将内部函数传递到所在的词法作用域之外,它都会持有对原始定义域的引用,无论在何处执行这个函数都会使用闭包。
this
this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
思考以下代码:
function b(){
console.log(this.a);
}
var obj = {
a:2,
b:b
}
obj.b();
很清晰就能知道结果输出2.不过自己来讲述原理可能就会觉得语言挺难组织。
比较正规的说法应该是这样的:
当函数引用有上下文的时候,隐式绑定规则会把函数调用的this绑定到这个上下文对象,因为调用b()时this被绑定到obj,因此this.a == obj.a
真很好理解。我们看下面一个例子
function b(){
console.log(this.a);
}
var obj = {
a:2,
b:b
}
var refer = obj.b;
var a = "Linshui";
refer();
虽然refer是obj.b的一个引用,但是实际上它引用的是b()本身,因此此时的refer是一个不带任何修饰的函数调用,因此应用了默认绑定。
function b(){
console.log(this.a);
}
function test(fn){
fn();
}
var obj = {
a:2,
b:b
}
var a = "Linshui";
test(obj.b);
参数传递其实还是一种隐式赋值,因此传入函数时也会被隐式赋值。照样输出Linshui.
补充
在javascript中创建一个空对象
最简单的方法都是Object.create(null)
Object.create(null) 和{}很像。但是不会创建Object.prototype这个委托。
因此Object.create(null) 比 {} 更空。
数组
看下面这段
var myArray = ["Lin","Shui","Zhao"];
myArray.Ying = "Ying";
myArray["X"] = "X";
myArray.length;//3
myArray.Ying;//Ying
myArray["X"];//X
可以看到虽然添加了命名属性,数组的Length并没发生变化。
但是如果你试图向数组添加一个属性,属性名看起来像一个数字,那么它会变成一个数组下标。
myArray["3"] = "Ying";
myArray.length;//4
构造函数
类构造函数属于类,而且通常与类同名,此外,构造函数大多需要New来调,这样语言引擎才知道你想要构造一个新的类实例。
function Nothing(){
console.log("米有东西");
}
var a = new Nothing(); //米有东西
a;//{}
Nothing本来是一个普通函数,但是用new后,它就会构造一个对象并赋值给a,这看起来像new的一个副作用(无论如何都会构造一个对象)。这个调用是一个构造函数调用。但是Nothing并不是一个构造函数。
换句话说,在javascript中对于构造函数的最准确的解释是:所有带new的函数调用。
结尾
总算结束了第一轮的阅读笔记。事实上我打算看完买的书后重新刷几遍高程,那个时候再来继续笔记<( ̄▽ ̄)>