一、認(rèn)識(shí)函數(shù)的上下文
- 什么是上下文
垃圾分類,`這`是非常好的習(xí)慣,值得表?yè)P(yáng) 隨手關(guān)燈,`這`是非常好的習(xí)慣,值得表?yè)P(yáng) 遛狗栓繩,`這`是非常好的習(xí)慣,值得表?yè)P(yáng) 課后復(fù)習(xí),`這`是非常好的習(xí)慣,值得表?yè)P(yáng) 早睡早起,`這`是非常好的習(xí)慣,值得表?yè)P(yáng)
- 函數(shù)的上下文
- 函數(shù)中可以使用
this
關(guān)鍵字,它表示函數(shù)的上下文
。 - 與中文中"這"類似,函數(shù)中的this具體指代什么
必須通過(guò)調(diào)用函數(shù)時(shí)的"前言后語(yǔ)"來(lái)判斷
- 函數(shù)中可以使用
- 函數(shù)中的this
var xiaoming = { nickname: '小明', age: 12, sayHello: function () { console.log('我是' + this.nickname + ',我' + this.age + '歲了'); } }; xiaoming.sayHello(); // 我是小明,我12歲了
var xiaoming = { nickname: '小明', age: 12, sayHello: function () { console.log('我是' + this.nickname + ',我' + this.age + '歲了'); } }; var sayHello = xiaoming.sayHello; // 將函數(shù)"提"出來(lái),單獨(dú)存為變量 // 直接圓括號(hào)調(diào)用這個(gè)函數(shù),而不是對(duì)象打點(diǎn)調(diào)用了 sayHello(); // 我是undefined,我undefined歲了
- 函數(shù)的上下文由調(diào)用方式?jīng)Q定
- 同一個(gè)函數(shù),用不同的形式調(diào)用它,則函數(shù)的上下文不同
- 情形1:對(duì)象打點(diǎn)調(diào)用函數(shù),函數(shù)中的
this
指代這個(gè)打點(diǎn)的對(duì)象
。xiaoming.sayHello();
- 情形2:圓括號(hào)直接調(diào)用函數(shù),函數(shù)中的
this
指代window對(duì)象
。var sayHello = xiaoming.sayHello; sayHello();
var obj = { a: 1, b: 2, fn: function () { console.log(this.a + this.b); } }; var fn = obj.fn; fn();
- 情形1:對(duì)象打點(diǎn)調(diào)用函數(shù),函數(shù)中的
- 同一個(gè)函數(shù),用不同的形式調(diào)用它,則函數(shù)的上下文不同
1. 上下文規(guī)則1
-
函數(shù)的上下文由調(diào)用函數(shù)的方式?jīng)Q定
- 函數(shù)的上下文(this關(guān)鍵字)由
調(diào)用函數(shù)
的方式?jīng)Q定, function是"運(yùn)行時(shí)上下文"
策略。 - 函數(shù)如果不調(diào)用,則不能確定函數(shù)的上下文。
- 函數(shù)的上下文(this關(guān)鍵字)由
-
規(guī)則1:
對(duì)象打點(diǎn)調(diào)用它的方法函數(shù),則函數(shù)的上下文是這個(gè)打點(diǎn)的對(duì)象
。
對(duì)象.方法()function fn() { console.log(this.a + this.b); } var obj = { a: 66, b: 33, fn: fn }; obj.fn(); // 99
- 構(gòu)成對(duì)象.方法()的 形式,適用規(guī)則1
var obj1 = { a: 1, b: 2, fn: function () { console.log(this.a + this.b); } }; var obj2 = { a: 3, b: 4, fn: obj1.fn }; obj2.fn(); // 7
- 構(gòu)成對(duì)象.方法()的形式,適用規(guī)則1
function outer() { var a = 11; var b = 22; return { a: 33, b: 44, fn: function () { console.log(this.a + this.b); } }; } outer().fn(); // 77
- 構(gòu)成對(duì)象.方法()的 形式,適用規(guī)則1
function fun() { console.log(this.a + this.b); } var obj = { a: 1, b: 2, c: [{ a: 3, b: 4, c: fun }] }; var a = 5; obj.c[0].c(); // 7
- 構(gòu)成對(duì)象.方法()的形式,適用規(guī)則1
2. 上下文規(guī)則2
-
規(guī)則2:圓括號(hào)直接調(diào)用函數(shù),則函數(shù)的上下文是window對(duì)象
函數(shù)()
var obj1 = { a: 1, b: 2, fn: function () { console.log(this.a + this.b); } }; var a = 3; var b = 4; var fn = obj1.fn; fn(); // 7
- 構(gòu)成函數(shù)()的形式,適用規(guī)則2
function fun() { return this.a + this.b; } var a = 1; var b = 2; var obj = { a: 3, b: fun(), // 適用規(guī)則2 fun: fun }; var result = obj.fun(); // 適用規(guī)則1 console.log(result); // 6
3. 上下文規(guī)則3
-
規(guī)則3:數(shù)組(類數(shù)組對(duì)象)枚舉出函數(shù)進(jìn)行調(diào)用,上下文 是這個(gè)數(shù)組(類數(shù)組對(duì)象)
數(shù)組[下標(biāo)]()
var arr = ['A', 'B', 'C', function () { console.log(this[0]); }]; arr[3](); // "A"
- 適用規(guī)則3
-
什么是類數(shù)組對(duì)象:所有鍵名為自然數(shù)序列(從0開始),且有
length
屬性的對(duì)象。 -
arguments對(duì)象是最常見的類數(shù)組對(duì)象,它是函數(shù)的實(shí)參列表。
function fun() { arguments[3](); } fun('A', 'B', 'C', function () { console.log(this[1]); // 'B' });
- 適用規(guī)則3
4. 上下文規(guī)則4
- 規(guī)則4:
IIFE中的函數(shù),上下文是window對(duì)象
。(function() {})();
var a = 1; var obj = { a: 2, fun: (function () { var a = this.a; return function () { console.log(a + this.a); // 3 } })() // 適用規(guī)則4 }; obj.fun(); // 適用規(guī)則1
5. 上下文規(guī)則5
- 規(guī)則5:定時(shí)器、延時(shí)器調(diào)用函數(shù),上下文是window對(duì)象
setInterval(函數(shù), 時(shí)間); setTimeout(函數(shù), 時(shí)間);
var obj = { a: 1, b: 2, fun: function () { console.log(this.a + this.b); // 7 } } var a = 3; var b = 4; setTimeout(obj.fun, 2000); // 適用規(guī)則5
var obj = { a: 1, b: 2, fun: function () { console.log(this.a + this.b); // 3 } } var a = 3; var b = 4; setTimeout(function() { obj.fun(); // 適用規(guī)則1 }, 2000);
6. 上下文規(guī)則6
- 規(guī)則6:事件處理函數(shù)的上下文是綁定事件的DOM元素。
DOM元素.onclick = function () {};
- 請(qǐng)實(shí)現(xiàn)效果:點(diǎn)擊哪個(gè)盒子,哪個(gè)盒子就變紅,要求使用同一個(gè)事件處理函數(shù)實(shí)現(xiàn)。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div{ width: 200px; height: 200px; float: left; border: 1px solid #000; margin-right: 10px; } </style> </head> <body> <div id="box1"></div> <div id="box2"></div> <div id="box3"></div> <script> function setColorToRed() { this.style.backgroundColor = 'red'; } var box1 = document.getElementById('box1'); var box2 = document.getElementById('box2'); var box3 = document.getElementById('box3'); box1.onclick = setColorToRed; box2.onclick = setColorToRed; box3.onclick = setColorToRed; </script> </body> </html>
- 請(qǐng)實(shí)現(xiàn)效果:點(diǎn)擊哪個(gè)盒子,哪個(gè)盒子在2000毫秒后就變紅,要求使用同一個(gè)事件處理函數(shù)實(shí)現(xiàn)。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div{ width: 200px; height: 200px; float: left; border: 1px solid #000; margin-right: 10px; } </style> </head> <body> <div id="box1"></div> <div id="box2"></div> <div id="box3"></div> <script> function setColorToRed() { // 備份上下文 var self = this; setTimeout(function() { self.style.backgroundColor = 'red'; }, 2000); } var box1 = document.getElementById('box1'); var box2 = document.getElementById('box2'); var box3 = document.getElementById('box3'); box1.onclick = setColorToRed; box2.onclick = setColorToRed; box3.onclick = setColorToRed; </script> </body> </html>
7. call 和 apply
-
call
和apply
能指定函數(shù)的上下文。function sum() { alert(this.chinese + this.math + this.english); } var xiaoming = { chinese: 80, math: 95, english: 93 }; sum.call(xiaoming); sum.apply(xiaoming);
- 函數(shù).call(上下文);
- 函數(shù).apply(上下文);
-
call
和apply
的區(qū)別文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-649471.htmlfunction sum(b1, b2) { alert(this.c + this.m + this.e + b1 + b2); } sum.call(xiaoming, 5, 3); // call要用逗號(hào)羅列參數(shù)x sum.apply(xiaoming, [5, 3]); // apply要把參數(shù)寫到數(shù)組中
-
到底使用call還是apply?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-649471.html
function fun1() { fun2.apply(this, arguments); } function fun2(a, b) { alert(a + b); } fun1(33, 44);
8. 總結(jié)
規(guī)則 | 上下文 |
---|---|
對(duì)象.函數(shù)() |
對(duì)象 |
函數(shù)() |
window |
數(shù)組[下標(biāo)]() |
數(shù)組 |
IIFE |
window |
定時(shí)器 |
window |
DOM事件處理函數(shù) |
綁定DOM的元素 |
call和apply |
任意指定 |
到了這里,關(guān)于學(xué)習(xí)筆記整理-面向?qū)ο?02-認(rèn)識(shí)函數(shù)的上下文的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!