高级 JavaScript 编程原理和一些总结
by Bruce Dou
at 2012-11-01 13:10:58
original http://blog.eood.cn/advanced_javascript
JavaScript 的特殊之处
JavaScript 用 prototype 和 constructor 实现了继承等 OOP 特性,但是他们的理解非常”绕”。
每个函数对象都有一个 prototype 对象
每个函数对象的 prototype 都有个 constructor 属性
函数构建的时候 prototype 指向父对象的 prototype,或者理解为复制一份
函数构建的时候 prototype 的 constructor 指向自己
调用函数的时候会执行 constructor 方法
函数可以调用自己 prototype 对象的属性和方法
函数可以覆盖自己 prototype 对象的属性和方法
你可能会在很多代码里看到类似 Array.prototype.slice 这样的调用方式。
JavaScript 函数的隐含特性
函数参数获取的第二种方式
不论你如何定义函数的参数,在调用函数的时候,所有参数都会以数组元素的形式赋值给函数的 arguments 这个变量
调用函数的对象被赋值为 caller ,被调用函数被赋值为 callee
作用域链和函数提升
普通 function 的定义可以做到前置调用,而变量式声明的函数则不能前置调用。
浏览器的顶级作用域是 window 。
其他
一切皆为对象和匿名函数的支持,让你可以这样定义和执行函数:
(function(){})()
JavaScript 的 call apply caller callee
call 和 apply 是将函数绑定到其他对象上执行。caller callee 的解释见前文。
ECMA 5 和 AMD, CommonJS
AMD (Asynchronous Module Definition) 提供了在浏览器端异步加载所需 js 文件的方式。
CommonJS 定义了服务器端模块化的支持方式,其中:
require() 来引用和调用文件中的对象
module.exports 和 exports 来为文件中的对象提供调用接口
引用:
http://ecma-international.org/ecma-262/5.1/
http://www.commonjs.org/
http://addyosmani.com/writing-modular-js/
http://requirejs.org/docs/whyamd.html