浅谈JavaScript的语言特性

487 查看

伯乐在线注:本文来自文章作者 @freestyle21 的投稿。

前言

在JavaScript中,作用域、上下文、闭包、函数等算是精华中的精华了。对于初级JSer来说,是进阶必备。对于前端攻城师来说,只有静下心来,理解了这些精华,才能写出优雅的代码。

本文旨在总结容易忘记的重要知识,不会讲基本的概念。如果对基本知识不太熟悉,就去翻下《Javascript权威指南》吧~

参考文章如下(建议读者朋友用chrome看这些文章吧,不然的话会错过很多精彩哦~):

http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/

http://benalman.com/news/2010/11/immediately-invoked-function-expression/

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

 

语言特性

函数表达式


先看代码段:

这里想说一点的就是,在函数表达式中的foo,只能在函数内部引用,外面是不能引用的。

json


很多JavaScript开发人员都错误地把JavaScript对象字面量(Object Literals)称为JSON对象(JSON Objects)。 JSON是设计成描述数据交换格式的,它也有自己的语法,这个语法是JavaScript的一个子集。

{ “prop”: “val” } 这样的声明有可能是JavaScript对象字面量,也有可能是JSON字符串,取决于什么上下文使用它。如果是用在string上下文(用单引号或双引 号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。

还有一点需要知道的是,JSON.parse用来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。老版本的浏览器不支持这个对象,但你可以通过json2.js来实现同样的功能。

原型

如果我们彻底改变函数的prototype属性(通过分配一个新的对象),那原始构造函数的引用就是丢失,这是因为我们创建的对象不包括constructor属性:

让我们一起看下MDN上关于constructor的解释吧:prototype:Returns a reference to the Object function that created the instance’s prototype.因此,对函数的原型引用需要手工恢复:

然而,提交prototype属性不会影响已经创建对象的原型(只有在构造函数的prototype属性改变的时候才会影响到),就是说新创建的对象才有有新的原型,而已创建对象还是引用到原来的旧原型(这个原型已经不能被再被修改了)。