最近两本书 读书笔记(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的函数调用。

结尾

总算结束了第一轮的阅读笔记。事实上我打算看完买的书后重新刷几遍高程,那个时候再来继续笔记<( ̄▽ ̄)>

Table of Contents