深入浅出理解JavaScript函数作用域和变量声明提前

函数作用域

在javaScript中是没有块级作用域的,代替的是函数作用域,这个与传统的java语言和我熟悉的actionScript是不同的。

    function test(o){
        if(typeof o == "object"){
            var j = 1;
            for(var k=0; k<10; k++){
                console.log(k);
            }
            console.log(k);  // 10
        }
        console.log(j); // 1
    }
    test({key:1});

传统的块级作用域,当声明变量k,那么k在for循环中是有效的,离开for循环是没有定义的,但是在javaScript中,输出了10,证明k无论在函数体内部任何位置声明,都是可以保存记录的。

变量声明提前

在javaScript中,在一个函数内部的内部变量,无论在函数内部哪里声明,都会立刻生效,影响了整体函数的内部变量。当然这回带来困扰,让代码产生歧义,最好的做法是在函数内部开始处进行声明,避免与全局变量的冲突,因为在函数内部,内部变量是优先执行的,忽略全局变量。

    var scope = "global";
    function f(){
        console.log(scope);  // undefined
        var scope = "local";
        console.log(scope);  // local
    }
    f();

上面的例子说明内部变量取代全局变量,并且变量声明提前,对阅读代码和程序执行造成了困扰。

    var scope = "global";
    function f(){
        console.log(scope);  // global
    }
    f();

内部变量不声明,全局变量被引用,正确输出引用的定义。

通过学习javaScript最大的感受就是要理解并记住与传统语言的编程运行差异,当然传统语言更好的编程习惯将保证你的代码更健壮,但是了解差异将帮助你更深入的理解javaScript并写出更好的前端代码。

转载于:https://my.oschina.net/ym1983/blog/829367

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值