语法

在代码中,每个代码块和方法都会返回一个值,结果值就如同一个隐式的返回,在函数中,如果没有指定return,那么就相当于在结束出添加一个 return undefined 。在代码块中返回最后一个语句的结果值,如:

var b;
        if (true) {
            b = 5 + 32;
        }

上面的代码中,其返回结果是37,但是想拿到返回值,用这种方法却不行:

    var b;
        var a= if (true) {
            b = 5 + 32;
        }

如果想要拿到其返回值,可以使用eval获取,即:

var b;
        var a = eval("if (true) {b = 5 + 32;}");
        console.log(a); //37

虽然不是一个好办法,但确实能获取到

()表达式

 var a = 42;
        var b = (a++);
        console.log(a); //43    
        console.log(b); //42

由结果可以看出,其实(0本身并不是一个封装表达式。

else if

在JavaScript中,其实是没有else if 语句的,所以我们经常用到的 else if 其实是这样的:

     if (a) {
        }
        else {
            if (b) {

            } else {

            }
        }

函数参数

 function foo(a=42,b=a+1)
            {
                console.log(arguments.length,a,b,arguments[0],arguments[1])
            }
            foo(); //0 42 43 undefined undefined
            foo(10); //1 10 11 10 undefined
            foo(10,undefined); //2 10 11 10 undefined
            foo(10,null);//2 10 null 10 null

虽然参数a和b都有默认值,但是函数不带参数时,arguments数组为空。

在来看一个参数绑定的例子:

   function foo(a) {
            a = 42;
            console.log(arguments[0]);
        }
        foo(2); //42
        foo(); //undefined

由此可以看出,向函数传递参数时,arguments数组中的对应单元会和命名参数建立关联,以得到相同的值,相反,不传递参数就不会建立关联。

需要特别注意的是,它并不是JavaScript语言本身的特性,而是语言引擎底层实现的一个抽象泄露。所以不要同时访问参数和其对应的arguments数组单元。

try finally

finally中的代码总是会再try之后执行,如果有catch则在catch之后执行,即无论什么情况下一定会被调用。如:

 function foo() {
            try{
                return 42;
            }
            finally {
                console.log("finally");
            }
            console.log("nerver");
        }
        console.log(foo());
        //finally
        //42

这里return 42会先执行,并将foo()函数的返回值设置为42,然后try执行完毕,在执行finally。最后foo执行完毕,执行console.log

如果finally中抛出异常,函数就会在此处种植,如果此前try中已经有return设置了返回值,则该值会被丢弃。

另外还需要注意,如果finally中用return返回了值,那么它会覆盖try 或 catch 返回的值。

switch

switch中的case的匹配算法,是与===相同。但是有时需要通过强制转换来进行比较,即==,这是就需要做一些特殊处理:

 var a = "42";
        switch (true) {
            case a == 10:
                console.log("10");
                break;
            case a == 42:
                console.log("42");
                break;
        }
        //42

尽管可以这样使用,但有一个需要特别注意的地方:

      var a = "42";
        var b = "45"

        switch (true) {
            case (a||b==42):
                console.log("10");//永远不会执行到这里
                break;
        }

因为(a||b==42)的返回结果是42,而非true,所以严格相等比较不成立,这是需要强制转换返回true或false,如 case !!(a||b==42)

全局DOM变量

有时我们在创建有id属性的dom时,也会创建一个同名的全局变量。例如:

<div id="foo"></div>
if(type foo==undefind){
    foo=42;
}
console.log(foo) //html元素

上面的代码中,如果稍不注意就会很容易让全局变量的检查错误百出,这有时尽量不要使用全局变量的一个原因。如果必须要用,那么久要保证唯一,不与html和第三方的代码同名。

 

posted @ 2016-12-22 11:15  8932809  阅读(239)  评论(0编辑  收藏  举报