一、this(粗糙的說,平時指向window,後期誰調用就指誰)
1、函數預編譯時。this --> window
function test(){
console.log(this);//window
}
test();
2、全局作用域裏this --> window
3、call/apply可以改變this指向,詳解參考上節課堂筆記
4、在obj.func()裏, func()裏面的this指向obj
var obj = {
a : function(){
console.log(this.name);
},
name : 'abc'
}
obj.a();
補充知識點:
1. 前面講到立即執行函數不具備名稱,如果想遞歸調用,函數引用寫什麼呢?arguments.callee就派上用場了。
var num = (function(n){
if(n == 1){
return 1;
}
return n * arguments.callee(n-1);
}(100));
2.還有一位叫func.caller(用處不大,但時而會和arguments.callee一起考。ES5標準模式下會報錯)
function test(){
demo();
}
function demo(){
console.log(demo.caller);//打印test。demo在哪兒執行,它的caller就是哪兒
}
test();
3.三目運算符:條件判斷?是:否,並且會返回值
var num = 1 > 0 ? 2 + 2 : 1 + 1;
var num = 1 > 0 ? ("10" > "9" ? 1 : 0) : 2;
二、克隆:分爲淺克隆和深克隆
1、淺克隆。能夠完成克隆,但克隆體obj1的屬性改變會聯動obj同時改變。並不是我們想要的結果。代碼如下:
var obj = {
name : 'abc',
age : 123,
gender : 'male',
card : {
card1 : 'visa',
card2 : 'master'
}
};
var obj1 = {};
function clone(origin, target){
var target = target || {};//容錯,防止用戶不傳target
for(var prop in origin){
target[prop] = origin[prop];
}
return target;
}
clone(obj, obj1);
2、深克隆。引用值只考慮數組和對象。先判斷obj屬性的值類型,過濾出object類型(null也需要考慮到),使用toString方法區分數組和對象,遞歸調用原函數。
var obj = {
name : 'abc',
age : 123,
gender : 'male',
card : {
card1 : 'visa',
card2 : 'master'
}
};
var obj1 = {};
function deepClone(origin, target){
var target = target || {},//容錯,以防用戶沒有傳target參數
toStr = Object.prototype.toString,//instanceof和constructor在父子域那塊兒有問題
arrStr = "[object Array]";
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
if(typeof(origin[prop] !== 'null' && origin[prop]) == 'object'){
// if(toStr.call(origin[prop]) == arrStr){
// target[prop] = [];
// }else{
// target[prop] = {};
// }
target[prop] = (toStr.call(origin[prop]) == arrStr) ? [] : {};
deepClone(origin[prop], target[prop]);
}else{
target[prop] = origin[prop];
}
}
}
return target;
}
deepClone(obj, obj1);
以上內容屬二哥原創,整理自 "渡一教育Javascript課程" ,一個值得推薦的"渡一教育"。