※Call、Apply
※this
window.onload = () => { new xxx(); ooo.o(); xxx(); xxx.call(); xxx.apply(); xxx.call(ooo); xxx.apply(ooo); xxx.bind(ooo)(); } let ooo = { o:xxx } function xxx(){ console.log(this); }
※結果:
※使用 new 時,this 指的是 new 的物件
JSON 裡的變數指定一個 function,此時 this 指的是這個 function
直接呼叫時,this == window
call 和 apply 沒有參數時,this == window;有參數時,this 指的是傳進去的參數
※最後的 bind 也很類似,但不會馬上執行,所以為了馬上執行,我在最後面加上「()」
※暫時變數
window.onload = () => { let o = new Obj(1,2); o.fun = plus; console.log(o.fun(o.x, o.y)); delete o.fun; // console.log(plus.call(o, o.x, o.y)); // console.log(plus.apply(o, [o.x, o.y])); // 這樣也可以 // console.log(plus.call(Obj, 1, 2)); // console.log(plus.apply(Obj, [1, 2])); } function plus(p1, p2){ return p1 + p2; } function Obj (x, y) { this.x = x; this.y = y; return x * y; }
※原本的作法比較麻煩,直接使用 call 或 apply ,就不用宣告暫時變數
※call 和 apply 第一個都是放物件,而 call 將要傳進去的參數一個一個放在後面;而 apply 只有二個參數,最後放陣列
※this
window.xxx = 'x'; window.onload = () => { window.xxx = 'xx'; let obj = {xxx:'xxx'}; showXxx.call(window); // xx showXxx.call(this); // xx showXxx.call(obj); // xxx showXxx.apply(window); // xx showXxx.apply(this); // xx showXxx.apply(obj); // xxx } function showXxx(){ alert(this.xxx); }
※要注意如果 onload 裡沒有 window.xxx,會抓更外面的
※還可參考高手寫的文章
※Closure
內層可以呼叫外層的變數,但外層不能呼叫內層的變數,但可以利用閉包來達到類似的功能let name = 'outside 2'; window.onload = () => { let name = 'outside'; let o = { name : 'inside', getName:function(){ // return this.name; // inside return function(){ // return xxx(); return this.name; } } }; alert(o.getName()()); // outside } function xxx(){ return this.name; }
※閉包首先要了解變數存活在哪
※累加
let name = 'outside'; function xxx(x) { let name = x; return function(x){ name += x; return name; } } let o = xxx(5); alert(o(1)); // 6 alert(o(2)); // 8 alert(o(3)); // 11
※還可以參考高手寫的
沒有留言:
張貼留言