物件下呼叫會影響 this
的指向
https://jsbin.com/viziyewore/edit?js,console1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16function callName() {
console.log(this.name);
}
var name = '全域';
var obj = {
name: '區域',
callName: callName,
watch: {
name: 'Watch',
callName: callName
}
}
callName() // "全域"
obj.callName(); //"區域" ,呼叫是在物件下調用,那麼 this 則是該物件
obj.watch.callName(); //"Watch"
https://jsbin.com/vihonezita/edit?js,console1
2
3
4
5
6
7
8
9
10
11
12
13var name = '全域';
var obj = {
name: '區域',
callName: function() {
console.log(this.name);
}
}
//callName; // callName is not defined
//callName(); // error" "TypeError: callName is not a function
obj.callName(); //"區域" ,呼叫是在物件下調用,那麼 this 則是該物件
var callName = obj.callName;
callName(); // "全域"
1 | var name = '全域' |
1 | var name = '全域' |
1 | var name = '全域' |
1 | var name = '全域' |
1 | var value = 'global'; |
1 | var value = 'global'; |
1 | var value = 'global'; |
1 | var name = '全域'; |
1 | var name = '全域'; |
1 | var name = '全域'; |
https://jsbin.com/tagalenuje/edit?js,console1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var name = '全域'
function easyCard(base = 100) {
var money = base
return function(update = 10) {
money = money + update
console.log(this.name, money)
}
}
var MingEasyCard = easyCard(100)
MingEasyCard(); // 110
MingEasyCard(); // 120
var YourEasyCard = easyCard(20);
YourEasyCard(); //30
var YourEasyCard2 = easyCard(20);
YourEasyCard2(100); // 120
var MyEasyCard = easyCard(1000)(100);
MyEasyCard(100); // "TypeError: MyEasyCard is not a function
1 | var name = '全域' |
1 | function myEasyCard(callback) { |
1 | var a = [1, 2, 3]; |
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#語法1
2
3arr.forEach(function callback(currentValue[, index[, array]]) {
//your iterator
}[, thisArg]);
這個 callback 函式將會把 Array 中的每一個元素作為參數,帶進本 callback 函式裡,每個元素各執行一次,接收三個參數:
currentValue 代表目前被處理中的 Array 之中的那個元素。 index,array, thisArg 選擇性
Note: IIFE、Closure、Callback function 與 this 關係是!? 沒有關係
call & apply
可以作為呼叫 Function 的另一個手段,皆是回傳function執行結果
而 bind
則會回傳一個經過包裹後的 Function 回來,回傳的是綁定 this 後的原函數。
「綁定this的函數」 一但被綁定,其this無法再被修改。
call vs. apply 作用完全一樣,只是接受參數的方式不太一樣1
2func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2]); //陣列
JavaScript Call
使用給定的this參數以及分別給定的參數來呼叫某個函數
1 | function callName(name) { |
bind 是ES5中新增的一個方法,可以改變函數內部的this指向
bind的應用場景
借用Array的原生方法
https://jsbin.com/pupasabapa/edit?js,console1
2
3
4
5
6
7
8
9var a = {};
Array.prototype.push.bind(a, "hello", "world")();
console.log(a);
// [object Object] {
// 0: "hello",
// 1: "world",
// length: 2
// }
http://www.dengzhr.com/js/1069
「箭頭函式沒有自己的 this」
https://jsbin.com/wuxiqeciko/edit?js,console1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22var name = '全域'
var obj = {
name: '區域',
callName: function () {
// 注意,這裡是 function,以此為基準產生一個作用域
console.log('1', this.name); // 1 "區域"
setTimeout(() => {
console.log('2', this.name); // 2 "區域"
//console.log('3', this); // 3 obj 這個物件
}, 10);
},
callNameArrow: () => {
// 注意,如果使用箭頭函式,this 依然指向 window
console.log('4', this.name); // 4 "全域"
setTimeout(() => {
console.log('5', this.name); // 5 "全域"
//console.log('6', this); // 6 window 物件
}, 10);
}
}
obj.callName();
obj.callNameArrow();
const func = (x) => x + 1
const func = function (x) { return x + 1 }
JS語言中函式的設計,必有回傳值,沒寫相當於回傳undefined
1 | // ['1','2','3'] 字串透過parseInt 轉數字 |
map() callback 回呼函式 參數 currentValue index array
parseInt() radix 能代表該進位系統的數字 注意,通常預設值不是 10 進位
https://wcc723.github.io/javascript/2019/03/18/JS-THIS/
https://paper.dropbox.com/doc/JSJavaScript-This---AZqD8PDvbl5uk5Mfq_EJlXMkAg-Xw50EZtMFNqG0wUxKeIaz
https://wcc723.github.io/javascript/2017/12/21/javascript-es6-arrow-function/