你不知道的javascript(上券)

2019-01-20  本文已影响0人  土豪码农

第一部分

第2章

第3章

if(false){
    var a = 2;
}
console.log(a); //undefined 不是a is not defined,
//不管if是否执行,var a都会提升到作用域的最顶端,一不小心很容易出问题

for (var i = 0; i < 5; i++) {}
    console.log(i);//5 这种也会造成一定程度的内存泄漏和全局污染
try{
    throw undefined
}catch (a){
    a = 2;
    console.log(a); //2
}
console.log(a);//a is not defined
function a() {
    var num = 1;
    function b() {
        console.log(num);//这种现象就是闭包
    }
}
function a() {
    var num = 1;
    function b() {
        console.log(num);//这就是闭包
    }
    return b
}

var b = a();
b(); //2,这里就是利用闭包的特性获取到里面
console.log(num);//num is not defined
(function () {
        var a = 1;
    })();
    
    function foo() {
        var a= 1;
    }
    foo();

就是利用函数会生成函数作用域的特性,自执行函数可以写匿名函数,比较方便,也少一个污染

第二部分

const obj0 = {
        a: 0,
        foo: function () {
            console.log(this.a);
        }
    };
    const obj1 = {
        a:1,
        obj0:obj0
    };
    const obj2 = {
        a:2,
        obj1:obj1
    };
    obj2.obj1.obj0.foo();//0

这个时候就是最近的那层,像上面的例子就是obj0最近的一层调用的,还有一点要注意的就是函数的赋值会导致this的变化或者丢失

const obj0 = {
        a:0,
        foo:function () {
            console.log(this.a);
        }
    };
    const obj1 = {
        a:1,
        foo:obj0.foo
    };
    const obj2 = obj0.foo;
    obj1.foo();////1 这里和上面有所不同的地方是obj0.foo这个函数直接赋值给obj1.foo和obj2
    obj2();// undefined

显式绑定:apply,call,bind,this指向传入的参数
new绑定:this指向new新建的对象

    const obj1 = {a:[1],b:2};
    console.log(Object.getOwnPropertyDescriptor(obj1, 'a'));
    //configurable: true enumerable: true value: [1] writable: true

有writable,value,enumerable,configurable,还可以设置set和get
value显而易见就是值了,writable就是限制能否修改值也就是value的权限,enumerable就是可枚举,如果设置为false,for in循环是拿不到的,es6的for of循环也一样,但是hasOwnProperty判断还是返回true的,in判断也是返回true的.configurable就是能否配置,为false的时候,就不能修改属性描述符了,而且是不可逆的,并且也不能删掉这个属性

const obj1 = {a:[1],b:2};
    Object.defineProperty(obj1,'a',{
        value: 2,
        writable:false
    });
    console.log(Object.getOwnPropertyDescriptor(obj1, 'a'));
    //configurable: true enumerable: true value: 2 writable: false
const obj1 = {
        get a(){
            return 2
        }
    };
    Object.defineProperty(obj1,'b',{
        get(){
            return this.a*2
        }
    });
    console.log(obj1.a); //2
    console.log(obj1.b); //4

两种方法设置,get和set最好成对出现,否则会吃出现一些意料之外的问题.这里附上尝试利用get和set实现双向数据绑定链接

上一篇 下一篇

猜你喜欢

热点阅读