Category Archives: JavaScript

浅谈JavaScript的闭包和作用域链

闭包和作用域链是JavaScript中比较重要的概念,这两天翻阅了一些资料,总结了一下。首先,看看几段简单的代码。 代码1: var name = “stephenchan”; var age = 23; function myFunc() { alert(name); var name = “endlesscode”; alert(name); alert(age); alert(weight); } myFunc(); myFunc(); 上述代码1中,两次调用myFunc()的输出是一致的。可能你会认为输出是: stephenchan endlesscode 23 [Reference Error] 但是结果却是: 代码1输出: undefined endlesscode 23 [Reference Error] 代码2: var i … Continue reading

Posted in JavaScript | 2 Comments

《JavaScript语言精髓与编程实践》读书拾遗-非函数式语言特性

变量的生存周期是指它何时被创建和被释放。在JavaScript中,一个变量的创建是在:引擎做语法分析时,发现显式声明;引擎做代码执行,发现试图写(例如赋值)一个未被创建的变量时。而变量的释放则是在:引擎执行到函数结束/退出操作时,将清除函数内的未被引用的变量;引擎执行到全局的代码块终结或引擎卸载和重载入时,将清除全局的亦是和数据的引用。 变量作用域讨论的是“在形式上这个变量能在哪个范围内存取到”。 对于具名函数的声明来说,抛开语法解析导致的问题不讲,一个具名函数是完全等同于一个匿名函数赋值给一个已经声明的变量标识符。 在JavaScript中,“空对象(null)“是作为一个保留字存在的。null不是“空的对象”,而是代表这样的一个对象:属性对象类型;对象是空值的。因为它是对象类型,所以用(typeof null)会返回object,甚至可以用for…in…去列举它,只不过因为它是空值,所以没有任何方法和属性,因而列举不到内容。 所谓“空的对象”,是一个标准的、通过Object()构造的对象实例,即通过obj = new Object();或者obj = { };空的对象具有“对象”的一切特性,可以存取预定义属性和方法(toString、valueOf等)。 对象只有“构造自某个原型”的说法,而不存在“持有(或拥有)某个原型”的说法。原型其实也是一个对象实例。原型的含义是指:如果构造器有一个原型对象A,则由该构造器创建的实例都必然复制自A。 JavaScript在构造对象的时候,采用的是读遍历的机制,即把写复制的粒度从原型变成了成员。这种方法的特点是:仅当写某个实例的成员时,将成员的信息复制到实例的的映像中,而并不是在刚构造时就从原型中复制全部成员。 在读遍历的机制下,所有的对象实例需要维护一张成员列表,这个成员列表指向在对象实例中发生了修改的成员名、值与类型。这张表是否与原型一致并不重要,只需要遵循两条规则:保证在读取时首先被访问到;如果在对象中没有指定属性,则尝试遍历对象的整个原型链,直到原型为空(null)或找到该属性。存取实例中的属性,比存取原型中的属性效率要高,因为少了一个指针访问。 实例创建后constructor属性总先被赋值为当前函数,当用delete删除constructor属性时,constructor则会指向父类的函数。

Posted in JavaScript | Leave a comment

《JavaScript语言精髓与编程实践》读书拾遗-JavaScript语法

JavaScript的6种基本数据类型undefined(未声明的变量,或者声明过但未赋值的变量的值,会是undefined。也可以显式或隐式地给一个变量赋值为undefined),string(不能直接读取或修改字符串中的单一字符),number,boolean,function,object。 NaN值,与自身并不等值,也不全等。 在早期Netscape的JavaScript中允许出现非Unicode字符,但现在ECMA标准统一要求JavaScript中的字符串必须是Unicode字符序列。 当一个直接量被识别为十进制整数时,它内部的存放格式可能是浮点数,也可能整型数,这取决于不同引擎的实现,因此不能指望JavaScript中的整型数会有较高的运算性能。 通过rx=/abcd\n\r/gi的直接量方式创建正则表达式对象,其中的转义字符是不能自动转义的,但通过rx=new RegExp(“abcd\n\r”,”gi”)的字符串创建正则表达式对象方式,其中的转义字符则会被自动转义,因此要在字符串中增加转义字符rx=new RegExp(“abcd\\n\\r”,”gi”)。 JavaScript中单词形式的运算符:typeof(取变量或值的类型)、void(运算表达式并忽略值,运算返回undefined)、new(创建指定类的对象实例)、in(检查对象属性)、instanceof(检查变量是否指定类的实例)、delete(删除实例属性)。 “===”和”!==”比较两个表达式,看是否具有相等的值或相同的数据类型。 JavaScript中,赋值是一个运算,而不是一个語句。 JavaScript中只有一种方法来完成函数调用,即在函数后紧临函数调用运算符”()”,这个运算符被解释为两个含义:使函数得以执行;从左到右运算并传入”( )”内的参数序列。 当語句位于以下几种情况之一时,可以省略分号:一个文本行或整个文本文件的末尾;在語法分隔符之前(如复合語句的大括号”}”);在复合語句的大括号”}”之后。 語句的返回值由最后的一个子句或表达式的值决定,即使不返回值,也会返回undefined。 没有引用的匿名函数调用方法(1):(function() { /*func body*/}()); 此为用强制运算符使函数调用运算得以执行。

Posted in JavaScript | Leave a comment