javascript 语言精粹读书笔记
函数
调用一个函数会暂停当前函数的执行,传递控制权和参数给新调用的函数,除了声明时传递的形式参数外,每个函数还会接受两个附加的参数: this和arguement.
其实在读到这句话的的时候,我产生了两个莫名其妙的疑问
1.’调用一个函数会暂停当前函数的执行’,这句话刚读起来觉得没什么问题,但是一分析我就觉得很不对。被调用的函数一定是在当前函数体内被调用的。所以,当前函数并没有暂停,只是交出了控制权而已。
2.’每个函数还会接受两个附加的参数: this和argument’,现在又有一个疑问,this和arguement是什么?至于arguement其实只是代表了实参列表,通过argument我们可以获取在参数调用实传递过来的参数
# this代表什么?
曾经看过阮一峰大神的一篇博客是这么来定义javascript的this的。
它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。随着函数使用场合的变化,this的值也会发生改变但是又一个总的原则,那就是this值得是,调用函数的那个对象。
我觉得这个定义还是很明白易懂的,这里主要透漏出两个重要的信息。其一:它是在函数调用时生成的而不是在函数定义时生成的。其二:它指向的是调用当前函数的对象。
在《你不知道的 javascript》中定义了”调用栈”,可以通过逐步的分析调用栈来找出this的最终指向,而在本书中则列出了四种调用模式。调用模式不同则this的指向也不同。
1.方法调用模式下this会被绑定到当前的对象
这里首先必须要将方法和函数区分开,方法就是当一个函数被当作一个对象的属性时称其为方法
2.纯函数调用模式下this会被绑定到全局变量
3.构造器调用模式下this会被绑定到实例对象上
4.apply/call调用模式下可以自定义绑定到特定的对象上
闭包
理解闭包,首先要理解js的作用域,内部函数可以访问定义它的外部函数的参数和变量。但是当我们想要访问函数内部的变量时,就要用到闭包了。
闭包的主要作用其实有两个
1.其中一个就是访问函数内部定义的变量
2.另外就是可以让这些变量常驻内存
曾经看过一个关于闭包的定义
闭包是一个函数,而它”记住了周围发生的一切”。表现为由一个函数体中定义了另一个函数,闭包是一个表达式(一般是函数),它具有自由变量以及绑定这些变量的环境(该环境封闭了这个表达式)。(闭包,就是封闭了外部函数作用域中变量的内部函数。但是,如果外部函数不返回这个内部函数,闭包的特性无法显现。如果外部函数返回这个内部函数,那么返回的内部函数就成了名副其实的闭包。此时,闭包封闭的外部变量就是自由变量,而由于该自由变量存在,外部函数即便返回,其占用的内存也得不到释放。)
上面这句换主要说出了闭包的两个关键点:
闭包嵌套在外部函数内部
外部函数将闭包返回
function outer() {
var i= 10
function inner() {
console.log(i++)
}
return inner()
}
var result = outer()
result() //10
result() //11
result() //12
继承
javascript的继承是基于原型(proptype)的。我对原型的理解是,其实人家本来是一个没有车厢的火车头,然后我们就可以给这个火车头安装各种各样的车厢,长的扁的,圆的方的(当然没有圆的车厢哈),虽然车厢可以各种各样,但是火车头只有一个,各种车厢都可以用这个火车头。
实现继承主要是为了实现代码的重用,以及数据的共享,对于各种公用的属性,我们可以将它放在proptyps里面,例如:
function Train(railway_carriage) {
this.railway_carriage = railway_carriage //各种安装车厢
}
但是当我们想要给各种列车都设置一个相同的火车头,如果是这样
function Train(railway_carriage, locomotive) {
this.railway_carriage = carriage
this.locomotive = locomotive
}
如果这样的话,每一个列车实例都会有一个各自的locomotive属性,但是这些属性又是相同的,这样的结果明显是不符合我们的本意的。
那么,这样的话我们就得用刀proptype属性了
Train.proptype = {
locomotive: 'D9999'
}
这样所有的Train实例就回共享locomotive属性了