一、匿名函數(shù) function(){}
1.1 作用域
匿名函數(shù)作用域,變量查找從定義處的上下文由內(nèi)向外依次查找估蹄。
1.2 this
匿名函數(shù)的this指向global塑煎,在瀏覽器中就是window。
例外:
1臭蚁、匿名函數(shù)作為對象的方法時(shí)最铁,this指向方法的調(diào)用者。
2垮兑、匿名函數(shù)作為事件函數(shù)時(shí)冷尉,this指向事件綁定的對象。
二系枪、箭頭函數(shù)()=> {}
2.1 作用域
箭頭函數(shù)的作用域雀哨,為定義處(也就是調(diào)用處)的上下文,變量查找遵循從內(nèi)層到外層的查找原則。
2.2 this
箭頭函數(shù)沒有this雾棺,箭頭函數(shù)的this就是環(huán)境的this膊夹,還有一點(diǎn)不同就是,該this一經(jīng)定義則綁定捌浩,不會被call apply等函數(shù)改變放刨。call等函數(shù)的使用有兩種情況,如果改變的環(huán)境this的指向尸饺,則箭頭函數(shù)的this隨之變化进统,如果想改變箭頭函數(shù)的this指向,使它脫離原環(huán)境侵佃,而指向新的this麻昼,則不會成功奠支。例如:
var obj = {
name:"小明",
getName1:function(){
return ()=>this.name
}馋辈,
getName2: ()=>{this.name}
}
var otherObj = {
name:"小紅"
}
obj.getName1.()() //小明
obj.getName1.call(otherObj)() //小紅 , 此處改變的是外層this指向。
obj.getName1().call(otherObj) //小明倍谜,此處試圖改變箭頭函數(shù)的this綁定迈螟,不成功。
obj.getName2() //undefined 尔崔,此處this為環(huán)境this答毫,為global,或者window
三 普通函數(shù) fuanction a() {} 或者 var a = function(){}
3.1 作用域
普通函數(shù)作用域?yàn)槎x處季春。
3.2 this
普通函數(shù)this指向調(diào)用者洗搂,一般不使用call等函數(shù)改變this,則為全局調(diào)用载弄,this指向global耘拇,如果使用call,apply宇攻,bind變更調(diào)用者惫叛,則指向新的調(diào)用者。如果作為方法調(diào)用逞刷,則this指向方法的擁有者嘉涌。
例外:
1、普通函數(shù)作為事件時(shí)夸浅,this指向綁定的事件對象仑最。
2、如果使用new帆喇,則指向new出來的對象词身。