鍍金池/ 問(wèn)答/Linux  HTML/ js對(duì)象方法里面為什么不能用箭頭函數(shù)

js對(duì)象方法里面為什么不能用箭頭函數(shù)

先上個(gè)代碼例子,再說(shuō)我不理解的地方,求指點(diǎn),謝謝!

var name="window";
var obj={
  name:'netease',
   print1:()=>{
    console.log(this.name);
  
  }
}
obj.print1();//window

es6中的this是定義時(shí)綁定,跟運(yùn)行時(shí)無(wú)關(guān),我很納悶就是這個(gè)例子中,定義時(shí) print1方法里面的this不是應(yīng)該最先查找到的就是obj里面的name嗎,為什么輸出是window,還是綁定到全局變量上去了?不是明明print1里面沒(méi)有this,再查找外圍this,先找到的應(yīng)該是obj中的this嗎?

回答
編輯回答
歆久
  1. 箭頭函數(shù)的this完全根據(jù)外部作用域來(lái)決定。
  2. 全局下的對(duì)象當(dāng)前的this是window。

解決方案:

var name="window";
var obj= {
    name : 'netease',
    that : this,
    print1: function(){     //函數(shù)包裹
        return ()=>{
            console.log(this.name);
        }
    },
    print2: ()=>{
        console.log(this.name);
    }
}
console.log(obj.that);     // window
obj.print1()();            // netease
obj.print2();              // window
  1. 我們先要搞清楚一點(diǎn),obj的當(dāng)前作用域是window,如 obj.that === window。
  2. 如果不用function(function有自己的函數(shù)作用域)將其包裹起來(lái),那么默認(rèn)綁定的父級(jí)作用域就是window。
  3. 用function包裹的目的就是將箭頭函數(shù)綁定到當(dāng)前的對(duì)象上。 匿名函數(shù)的作用域是當(dāng)前這個(gè)對(duì)象,所以之后箭頭函數(shù)會(huì)自動(dòng)綁定到此函數(shù)所在作用域的this,即obj 。

我最近的文章里有詳細(xì)的說(shuō)明。 ( 逃

2018年7月21日 21:41
編輯回答
編輯回答
兔寶寶

es6,箭頭函數(shù)的this指向父級(jí)

2017年8月2日 17:04
編輯回答
莓森

其實(shí)很容易看的。

普通函數(shù)的 this 是動(dòng)態(tài)的,所以要在運(yùn)行時(shí)找擁有當(dāng)前上下文的對(duì)象。

而箭頭函數(shù)的 this 是靜態(tài)的,也就是說(shuō),只需要看箭頭函數(shù)在什么函數(shù)作用域下聲明的,那么這個(gè) this 就會(huì)綁定到這個(gè)函數(shù)的上下文中。即“穿透”箭頭函數(shù)。

例子里的箭頭函數(shù)并沒(méi)有在哪個(gè)函數(shù)里聲明,所以 this 會(huì) fallback 到全局/undefined

https://blog.crimx.com/2016/0...

2017年6月14日 02:29
編輯回答
萌吟

可以參考下js箭頭函數(shù)的幾種寫法http://www.aazzp.com/2017/11/...

2018年7月16日 21:07
編輯回答
命于你

箭頭函數(shù)對(duì)this的綁定是強(qiáng)制性,優(yōu)先級(jí)最高的而且不可更改的,簡(jiǎn)單理解就是直接使用了詞法作用域,按照詞法作用域來(lái)理解就不會(huì)出錯(cuò),不用再理會(huì)那些復(fù)雜的this規(guī)則。
你的例子里的this就相對(duì)于指向了當(dāng)前函數(shù)所在的詞法作用域,也就是全局作用域,自然就是window。
如果不知道什么是詞法作用域的話,換句話說(shuō),你直接寫下面這樣,效果也是一樣的。

var name="window";
var obj={
  name:'netease',
   print1:()=>{
    console.log(name);
  
  }
}
obj.print1();
2017年3月6日 10:40
編輯回答
孤慣

箭頭函數(shù)是本身沒(méi)有執(zhí)行的上下文,沒(méi)有本身的this 是找離他最近的一個(gè)執(zhí)行環(huán)境作為執(zhí)行上下文,最近的this作為它的this 在這里,是window
可以試試以下代碼 把var name="window"去掉

var obj={
  name:'netease',
   print1:()=>{
    console.log(this.name);  
  }
}
obj.print1();//結(jié)果是undifined

再試試以下代碼
  var obj={
  name:'netease',
   print1:function(){//不用箭頭函數(shù),this指向obj對(duì)象本身

    console.log(this.name);  
  }
}
obj.print1();//結(jié)果是netease
2017年11月15日 05:30
編輯回答
安于心

箭頭函數(shù)沒(méi)有自己的上下文,this為調(diào)用方法時(shí)所在上下文
如圖,這里就是在window下調(diào)用,上下文為外面的

2017年10月19日 16:05
編輯回答
朽鹿

謝邀。

下面這句話引自《深入理解ES6》

箭頭函數(shù)沒(méi)有 this/super/arguments/new.target 的綁定,這些值是由外圍最近一層非箭頭函數(shù)決定。

箭頭函數(shù)的this和普通函數(shù)的this可以看成完全兩個(gè)概念的東西,不用傳統(tǒng)的this去理解。

我對(duì)外圍的理解是,這個(gè)外圍指的是()=>{}整體的外圍,比如你的代碼中:name屬性的外圍是什么?print1的外圍是什么?。所以 ()=>{console.log(this.name);}的外圍已經(jīng)出了obj,從而進(jìn)入window

可以借助我下面的代碼來(lái)理解:

    var name = "window";
    var obj = {
        name: 'netease',
        print1: () => {
            console.log(this.name);
        },
        print3: function () {
            return ()=>{
                console.log(this.name);
            }
        }
    }
    obj.print1();// window
    obj.print3()();// netease 注意是返回閉包函數(shù)
2017年6月28日 12:01