高级知识点:
~、由于匿名函数没有名称,不会引入新的变量污染上下文环境,而且会带来新的变量作用域,因此匿名函数常被用来防止全局环境污染。
~、如果函数作为参数或返回值使用时,就称为高阶函数,JavaScript中的函数都可以作为高阶函数来使用,这也是第一类函数的特征。
~、用一个常用的类比来解释闭包和类(Class)的关系:类是带函数的数据,闭包是带数据的函数。
~、instanceof操作符就是通过判断第二个操作数的原型对象是否在第一个操作数原型链上来进行判别。
相关讲解文章:
http://blog.csdn.net/kevinwon1985/article/details/7719906
var Animal = function( age ){
this.age = age;
}
var cat = new Animal( 2 );
console.log( cat instanceof Animal );//true
console.log( cat instanceof Object );//true
console.log( cat instanceof Function );//false
~、new运算符改变了函数的执行上下文,同时改变了return语句的行为。
~、with语句主要用来临时扩展作用域链,将语句中的对象添加到作用域的头部。
对js语言底层本质将的吊的文章:
http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
~、valueOf是给运行和控制台用,toString是给alert用 (在一篇文章的评论中, 看到这句话),从字面上看,valueOf是转成值的,toString是转成字符串的。
司徒正美比较的 valueOf和toString用法
~、ECMA中并没有__proto__这个方法,这个是ff、chrome等js解释器添加的,等同于EMCA的[[Prototype]],这不是标准方法。伯乐在线一篇文章:http://blog.jobbole.com/19795/
基础知识点:
~、String的match()方法的参数正则对对象,如果有g(全局搜索),那么每一次的匹配结果,只保存匹配的字符串,而不保存匹配字符串里匹配的子字符串。如果不是全局搜索,那么,将以数组的形式,返回匹配的字符串,以及匹配字符串里匹配的子字符串。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。
var str="Hello world! world";
var reslt = str.match(/world/);
reslt.constructor.prototype.yyp="ddddd";
/*这样写可一个将一个属性加到数组的原型对象里,实例对象隐含有构造器(constructor)属性*/
reslt.ddd="heehh";
alert(reslt.yyp);//dddd
var test = [];
alert(test.yyp)//dddd
~、使用RegExp构造器声明时,要对元字符里的 \ 进行转义,如:
var pattern = new RegExp("\\s*", "ig");//构造器命名
var pattern = /\s/ig; //字面量命名
~、既然window对象扮演着Global对象,那么所有在全局作用域中声明的对象、变量和函数都会变成window的属性和方法。
定义全局变量和在window对象上定义属性还是有差别的:全局变量不能通过delete删除,而在window对象上定义的属性则可以。
var age=28;
window.color="red";
//在IE<9是抛出错误,在其他浏览器中都返回false
delete window.age;
//在IE<9是抛出错误,在其他浏览器中都返回true
delete window.color; //return true
alert(window.age); //28
alert(window.color); //undefined
~、在使用var语句添加window属性时,有一个名为[[Configurable]]的特性,这个特性的值被设置为false,因此这样定义的属性不可以通过delete删除。
在尝试访问未声明的变量会抛出错误,但通过查询window对象,可以知道某个可能未声明的变量是否存在。
//这里抛出错误,因为oldValue未声明
var newValue=oldValue;
//这里不会抛出错误,因为这是一次属性查询
var newValue=window.oldValue // alert(newValue); //undefined
这个知识点学习自:
http://www.cnblogs.com/zxj159/archive/2013/06/03/3115141.html
~、一个说明异步的很好例子:
var a = 6;
setTimeout(function () {
alert(a);
a = 666;
}, 1000);
a = 66;//最后结果会弹出66
var a = 6;
setTimeout(function () {
alert(a);
var a = 666;
}, 1000);
a = 66;//最后结果会弹出undefined