1、函数预编译过程 this —> window
2、全局作用域里 this —> window
3、obj.func(); func()里面的this指向obj), 可以这样理解,谁调用func,则this就指向谁
4、call/apply 可以改变函数运行时this指向,
(1)、call用法:
func.call(要改变后的this, arg1, arg2, … );
(2)、apply用法:
func.apply(要改变后的this, [arg1, arg2, arg2]);
(3)、apply和call共同点:都是改变this指向
apply和call不同点:传参形式不同,call是将参数一个个传进来,而apply是将所有参数存进一个数组中,然后将该数组传
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// demo1 function demo1() { console.log(this); } // demo1() <==> this.demo1(); <==> window.demo1() demo1(); // window // demo2 var demo2 = { retThis: function () { console.log(this); } } demo2.retThis(); // demo2 = {...} // call / apply改变this demo1.call(demo2); // demo2 = {} demo2.retThis.call(window); // window |
对象克隆,分为浅克隆和深克隆,而上边的直接赋值的克隆操作为浅克隆,为什么称为浅克隆呢?因为,克隆的和被克隆的对象在克隆操作完成后,指向同一个地址引用,改变其中一个(注意:此处的改变为增加或删除对象的属性,而不是为该对象重新赋值一个对象),另一个也会改变,而深克隆则不会产生此现象。
深克隆/深拷贝代码如下:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 对象的深度克隆(Array / obj /...) function deepClone(obj) { var str, retObj = Object.prototype.toString.call(obj) === '[object Array]' ? [] : {}; if(typeof obj !== 'object') { return; }else if(window.JSON) { str = JSON.stringify(obj); retObj = JSON.parse(str); } else { for(var prop in obj) { retObj[prop] = typeof obj[prop] === 'object' ? deepClone(obj[prop]) : obj[prop]; } } return retObj; } |