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

推荐这些相关文章

订阅这个博客:

关注我的微博:

关注我的推特: