现在的位置: 首页 > 综合 > 正文

js注意点

2014年09月05日 ⁄ 综合 ⁄ 共 1459字 ⁄ 字号 评论关闭

   以下内容来自读网上博客的总结,当笔记使用,只记重点,同时非常感谢乐于分享的博主们,是你们让我站在了巨人的肩旁上!

 
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序列化只能处理基本的几种类型,所以对象里的函数字段会去掉。

抱歉!评论已关闭.