以下内容来自读网上博客的总结,当笔记使用,只记重点,同时非常感谢乐于分享的博主们,是你们让我站在了巨人的肩旁上!
1、
JavaScript的变量范围;js的变量范围不像c语言 变量的作用范围是{}语句界定符,JavaSript的变量范围是以函数为基础的.
var herp = "one";
{ var herp = "two";}
alert(herp);结果是 “two”,而不是“one”;
2、
在ITeye上看过一篇名叫《写了10年Javascript未必全了解的连续赋值运算》文章,文章陈述了平时在工作当中容易忽略的连续赋值时的陷阱。
本人认为,那篇文章,没有给出一个很让人容易理解的思维过程。下面给出我自己的理解:
var a = {n:1};
var b = a; // 持有a,以回查
a.x = a = {n:2};
alert(a.x);// --> undefined
alert(b.x);// --> [object Object]
赋值代码就是上边的几句,下面给出我的理解思路:
var a = {n:1};
var b = a;
这2句之后,a 和 b 都指向 { n :1}这个对象;
a.x = a = {n:2}
这句是关键一步,我是这样理解的:大家知道,在编程语言中成员选择符 . 的优先级是一级,所以首先 a.x 把 x 作为一个字段加入到 a对象中,而此时的a对象是{ n :1},所以x字段被加入到{n :1 }中 后,此时的对象已经变为 {n :1, x : undefined},成员选择符计算完,就该执行 优先级很低的 赋值运算符 = ,由于赋值运算符是右结合性,所以a 变量指向{n: 2};{n :1, x : undefined}该对象的x字段也指向{ n: 2};如此就可以解释以上结果,说白了,就是 运算符优先级和引用类型 的问题;
3、
this指的是调用该方法的对象(若没有,就是window对象),不是所属对象;
var length = 10
function fn(){
alert(this.length)
}
var obj = {
length: 5,
method: function(fn) {
fn() // ?
arguments[0]() // ?
}
}
obj.method(fn);//10,1
fn.call(obj);//5
该例子出自:http://www.cnblogs.com/snandy/archive/2012/09/18/2669960.html
4、
所有的通过关键字 var 声明的变量都会提前,而赋值发生在代码执行的时候:
if (!("a" in window)) {
var a = 1;
}
alert(a);// undefined
该例子出自:
http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html
5、
函数声明会覆盖变量声明,当然如果赋值是可以覆盖的。
function test(){
}
var test;
alert( typeof test ) //function
test = 1;
alert( typeof test ) //number
6、
在标准浏览器里,变量b的赋值表达式里的a 和 全局里的a不冲突,但是在小于等于ie8的浏览器里,处理a时 是安照上面的第五条规则来处理的,所有a 是 1。
var a = 1,
b = function a(x) {
x && a(--x);//这里会形成一个小递归
alert(x);
};
b(2); //在标准浏览器下,依此弹出: 0 0 1; lte IE8 会报错
7、
JSON序列化只能处理基本的几种类型,所以对象里的函数字段会去掉。