this字面意思是當前,當前執行代碼的環境對象或者是上下文。表明着當前方法執行的環境上下文,那麼何爲環境上下文,通俗的說,誰調用了函數,誰就是這個函數的環境上下文。瀏覽器
在js中,this只有兩種指向,一種是指向當前的封閉做用域,或者是指向當前做用域的外層,this的最頂層就是window對象。app
關於this必需要了解的是嚴格模式,嚴格模式是js裏面的一個子集,是具備限制性JavaScript變體,嚴格模式也是js的一種,可是加了一些限制。函數
好比:優化
進入"嚴格模式"的標誌:"use strict";this
// 爲整個腳本開啓嚴格模式 "use strict"; var v = "Hi! I'm a strict mode script!"; // 爲函數開啓嚴格模式 function strict() { 'use strict'; function nested() { return "And so am I!"; } return "Hi! I'm a strict mode function! " + nested(); }
在全局環境下,不管是否在嚴格模式下,在全局執行環境下(任何函數體外部)this指向全局對象。也就是說在全局執行環境,這個this永遠指向全局對象,這個全局對象在瀏覽器中就是window。code
//瀏覽器環境 var name = 'Eric'; console.log(window.name === this.name); /* true */ console.log(window === this); /* true */
在函數體內部,this的值取決於函數被調用的方式。函數被調用的方式有不少種:對象
簡單調用,也就是說沒有添加任何額外的操做,沒有添加一個this的綁定或者是改變。遞歸
簡單調用分爲嚴格模式與非嚴格模式。ip
// 瀏覽器環境 function simple(){ return this; } console.log(simple() === window); // true
// 瀏覽器環境 function simple2(){ "use strict"; return this; } simple2() === undefined; // true window.simple2() === window; // true
this傳遞,在js中this綁定有兩種:作用域
// 瀏覽器環境 var object = { name: 'Eric' }; var name = 'Iven'; function getName(arg) { return this.name; } getName(); /* Iven */ getName.call(object); /* Eric */ getName.apply(object); /* Eric */
name = 'Davy'; function bindThis(){ return this.name; } var getName1 = bindThis.bind({ name: "Eric" }); console.log(getName1()); /* Eric */ var getName2 = getName1.bind({ name: "Iven" }); console.log(getName2()); /* Eric */
箭頭函數在執行的時候會造成一個封閉的做用域,this與封閉做用域的this保持一致,call/apply/bind都將會被忽略。
// 瀏覽器環境 var globalThis = this; var arrowsFunction = () => this; console.log(arrowsFunction() === globalObject); /* true */
做爲對象的方法被調用(有一個靠近原則):在對象裏面定義了一個函數,而後經過對象去調用這個函數。
// 瀏覽器環境 var object = { name: 'Eric', getName: function() { return this.name; } }; console.log(object.getName()); /* Eric */ function getName2() { return this.name; } object.getName = getName2; console.log(object.getName()); /* Eric */ object.object = { getName: getName2, name: 'Iven' }; console.log(object.object.getName()); /* Iven */
setInterval()方法用於在指定的毫秒數後調用函數或計算表達式。
語法:setTimeout(code,millisec),參數code必需,要調用的函數後執行的JavaScript代碼串;millisec必需,在執行代碼前等待的毫秒數。
注意:setTimeout()只執行code一次,若是須要屢次調用,請使用setInterval()或者讓code自身再次調用setTimeout(),也就是利用遞歸。
setInterval()方法可按照指定的週期來調用函數或計算表達式。它會不停地調用函數,指導clearInterval()被調用或者窗口被關閉。由setInterval()返回的ID值能夠用做clearInterval()方法的參數。
語法:setInterval(code,millisec[,"lang"])