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

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

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

第2章:词法作用域

2.1 词法阶段

function foo(a){
    var b = a * 2;
    function bar(c){
        console.log(a, b, c);
    }
}
foo(2);  //2, 4, 12

2.2 欺骗词法

eval()函数

function foo(str, a){
    eval(str);
    console.log(a, b);
}
var b = 2;
foo("var b = 3;", 1);  //输出 1, 3

with()函数

var obj = {
    a : 1,
    b : 2,
    c : 3
};

//正常的调用需要重复的引用Obj对象
obj.a = 10;
obj.b = 20;
obj.c = 30;

//单通过with可以构造一个,obj对象引用的快捷方式
with(obj){
    //with代码内this默认指向obj对象
    a = 10;
    b = 20;
    c = 30;
}
//定义一个foo方法
function foo(obj){
    //方法体中,通过with快捷方式对传入的对象进行赋值操作
    with(obj){
        a = 2;
    }
};

//定义对象obj1,包含a属性
var obj1 = {
    a : 3
};

//定义对象obj2,不包含a属性
var obj2 = {
    b : 3
};

//调用foo函数,并传入obj1对象作为参数
foo(obj1);
console.log(obj1.a);    //输出 2,foo()方法将a属性成功改为2

//调用foo函数,并传入obj2对象作为参数
foo(obj2);
console.log(obj2.a);    //输出 undefined,由于obj2对象没有a属性,所以赋值失败
console.log(a); //输出2,属性a的赋值,暴露到了全局作用域上了

性能

2.3 小结

上一篇 下一篇

猜你喜欢

热点阅读