浓缩解读前端系列书籍一周一章前端书

一周一章前端书·第3周:《你不知道的JavaScript(上)》

2017-10-11  本文已影响16人  梁同学de自言自语

第3章:函数作用域和块级作用域

3.1 函数中的作用域

function foo(a){
    var b = 2;
    function bar(){
        //...
    }
    var c = 3;
}

bar();  //失败
console.log(a,b,c); //失败

3.2 隐藏内部实现

var b;
function doSomething(a){
    b = a + doSomethingElse(a * 2);
    console.log(b * 3);
}

function doSomethingElse(a){
    return a - 1;
}

doSomething(2); //15

通过函数作用域修改后,是不是更安心了:

function doSomething(a){
    var b;
    function doSomethingElse(a){
        return a - 1;
    }
    b = a + doSomethingElse(a * 2);
    console.log(b * 3);
}
doSomething(2); //15
function foo(){
    function bar(a){
        i = 3;
        console.log(a + i);
    }
    
    for(var i=0;i<10;i++){
        bar(i * 2);
    }
};

foo();  //因为调用的i是通一个,造成无限循环

(1) 全局命名空间

(2) 模块管理

3.3 函数作用域

var a = 2;
(function foo(){
    var a = 3;
    console.log(a); //3
})();
console.log(a); //2 函数作用域对内部的a做了隐藏,不影响全局的作用域
setTimeout(function(){
    console.log('I waited 1 second!');
},1000);
(function(){
    console.log('test');
}())
var a = 2;
(function(global){
    var a = 3;
    console.log(a); //3
    console.log(global.a);  //2
})(window);
console.log(a); //2
var a = 2;
(function iife(def){
    def(window);
})(function(global){
    var a = 3;
    console.log(a); //3
    console.log(global.a);  //2
});

3.3 块作用域

//虽然i声明于for循环的花括号范围内
//但注意i是用var来声明的,实际上它是全局作用域下的变量
for (var i=0;i<10;i++){
    consooe.log(i);
}

with

try/catch

try{
    makeError();
}catch(err){
    console.log(err);
}
console.log(err);   //ReferenceError: err not found

let

var foo = true;
if(foo){
    {
        let bar = foo * 2;
        bar = something(bar);
        console.log(bar);
    }
}
console.log(bar);   //ReferenceError
{
    console.log(bar);   //ReferenceError!
    let bar = 2;
}

const

var foo = true;
if(foo){
    var a = 2;
    const b = 3;    //在if块级作用域下的常量
    
    a = 3;  //赋值正常
    b = 4;  //赋值失败!常量不能改变
}

console.log(a); //3
console.log(b); //ReferenceError!

3.5 小结

上一篇 下一篇

猜你喜欢

热点阅读