第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

有時(shí)候會(huì)用一個(gè) _this 來(lái)讓 this 穿透函數(shù)定義, 但我想不是個(gè)好辦法啊,還有其他方法嗎?

有時(shí)候會(huì)用一個(gè) _this 來(lái)讓 this 穿透函數(shù)定義, 但我想不是個(gè)好辦法啊,還有其他方法嗎?

慕斯王 2023-04-28 23:19:11
一個(gè)不明白的問(wèn)題. 剛開(kāi)始我學(xué)的是用函數(shù)式的寫法, 而且在 JS 函數(shù)嵌套函數(shù)是很容易的, 這么就搞定了.后來(lái)我接觸到 JS 的 this, 理解每個(gè)函數(shù)的 this 指向自身所屬對(duì)象, 接著就開(kāi)始接觸 OOP 的內(nèi)容了.但這里有個(gè)問(wèn)題, 如果我再對(duì)函數(shù)進(jìn)行嵌套, this 就可能出錯(cuò)了.比如一個(gè)對(duì)象的方法里, 里邊再定義函數(shù)用來(lái)作為參數(shù)傳遞..或者僅僅是 forEach 增加一層作用域:obj =   people: ['a', 'b', c]   data:    a: 'aaa'     b: 'aaa'     c: 'aaa'   say: ->     this.people.forEach (name) ->       console.log this.data[name]obj.say()在函數(shù)式編程里, 沒(méi)有看到 this 這樣其葩的功能, 而在有 C/Java 一類語(yǔ)言, 不常用嵌套函數(shù)的.就像兩個(gè)東西不能很好地兼容似的... 但兩個(gè)都被直接拿過(guò)來(lái)用在了腳本語(yǔ)言里邊不知道有沒(méi)有好的方案來(lái)解決?
查看完整描述

2 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

面向?qū)ο笳Z(yǔ)言來(lái)說(shuō),舉Java的例子:

class Foo {
   boolean bar() {       return this.getClass() == Foo.class;
   }   
   class InnerFoo {
       boolean baz() {           return this.getClass() == InnerFoo.class;
       }
       
       boolean baz2() {           return Foo.this.getClass() == Foo.class;
       }
   }
}

bar里面的this指向的是Foo類型的對(duì)象,baz里面的this指向的是InnerFoo類型的對(duì)象,而baz2里面的Foo.this指向的是外層的Foo類型的對(duì)象,所以需要用Foo來(lái)限定。

其實(shí)把對(duì)象本身作為參數(shù)顯式的傳入并不是什么bad practise,在Python中就是這樣約定的:

class MyClass:    def __init__(self, name):        self.name = name        
    def greet(self, friend):
        print self.name, "says hello to", friend

所以在JS中,需要特殊的處理this綁定的問(wèn)題,比如用var that = this然后引用that就是一個(gè)常用的方法。

函數(shù)編程里雖然沒(méi)有this變量作為隱含參數(shù)傳入,但是事實(shí)上是有更有效的工具的:閉包(closure)。事實(shí)上this變量可以算是閉包的一種情況。而在一些dynamic scoping的語(yǔ)言(如elisp)里面,函數(shù)的運(yùn)行依賴于調(diào)用環(huán)境,所以“隱含的參數(shù)”其實(shí)更多。

我個(gè)人的看法是,面向?qū)ο罄锩鏋榱朔奖悖ɑ蛘邚?qiáng)調(diào))封裝(encapsulation),把數(shù)據(jù)和操作綁定在一起,“this”的地位才如此重要。而函數(shù)編程語(yǔ)言中,第一公民是函數(shù)(操作)而不是數(shù)據(jù),所以并沒(méi)有this的地位。這兩者是不同的思維范式,取長(zhǎng)補(bǔ)短即可。


查看完整回答
反對(duì) 回復(fù) 2023-05-02
?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

forEach這個(gè)具體的例子來(lái)看,問(wèn)題倒比較容易解決,畢竟

Array.forEach(callback[, thisArg])

里可以直接將外層的this傳入,這樣就解決了。

從更一般的角度來(lái)看,以我愚見(jiàn),定義一個(gè)var this_,雖然不太好看,但是在需要多次使用外層的this的時(shí)候,還是很方便的。
如果不需要多次使用this的話,Function.bind也可以在一定程度上解決這個(gè)問(wèn)題。

想要根本上解決這個(gè)問(wèn)題,也可以考慮在每個(gè)構(gòu)造函數(shù)里加入類似這樣的代碼:

// methodNames是一個(gè)包含所有方法名稱的ArraymethodNames.forEach(function(name) {    this[name] = this[name].bind(this)
}, this);

缺點(diǎn)是這么做會(huì)大大降低運(yùn)行效率,而且也不好看。

總的來(lái)說(shuō)這是Javascript的設(shè)計(jì)上的問(wèn)題,只能繞過(guò)去了。

如果是用CoffeeScript的話,那么可以使用它提供的=>來(lái)定義一個(gè)保留外層this的函數(shù):

class Tree
  constructor: (@value, @children) ->

  show: () ->
    @children.forEach (child) =>      # Note the fat arrow (=>) used here
      console.log "<Tree %s %s>", @value, child

t = new Tree "root", [1, 2, 3]
t.show()

這個(gè)功能看起來(lái)還是不錯(cuò)的..


查看完整回答
反對(duì) 回復(fù) 2023-05-02
  • 2 回答
  • 0 關(guān)注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)