2016-09-01 69 views
2

主要關注的是效率。什麼是使用這個內部匿名函數的有效解決方法?

我正在研究javascript作用域,並且我很困惑的一件事是this函數內部。

我已經閱讀了很多答案,我理解他們。但我關心的是效率。看看我的代碼。

class Fancy { 
    constructor() { 
    } 

    checkScope (callback) { 
    console.log('Inside checkScope'); 
    callback(); 
    } 
} 

class Prog { 
    constructor() { 
    this.name = 'myProg'; 
    this.fancy = new Fancy(); 
    } 

    run() { 
    var that = this; 
    this.fancy.checkScope(function() { 
     console.log('Name ', that.name); 
    }); 
    } 
} 

var prog = new Prog(); 
prog.run(); 

現在run()我在一個局部變量that存儲this參考。這對我有用。但是安全嗎?它有效嗎?如果不是,請給我一個好的策略/竅門。

謝謝:)

回答

2

是的,它是安全的,但你可以使用新的arrow syntax。它保留this

class Fancy { 
 
    constructor() { 
 
    } 
 

 
    checkScope (callback) { 
 
    console.log('Inside checkScope'); 
 
    callback(); 
 
    } 
 
} 
 

 
class Prog { 
 
    constructor() { 
 
    this.name = 'myProg'; 
 
    this.fancy = new Fancy(); 
 
    } 
 

 
    run() { 
 
    // Here your don't need var that = this, 
 
    // because the arrow function gets the same this 
 
    this.fancy.checkScope(() => { 
 
     console.log('Name ', this.name); 
 
    }); 
 
    } 
 
} 
 

 
var prog = new Prog(); 
 
prog.run();

每一個簡單的功能都有它this,你的情況你

function() { 
     console.log('Name ', this.name); // this is undefined in 'strict mode' 
    } 

都有自己this。所以你需要保持this功能外,並用別名使用在功能。ES6有一個新的arrow syntax functionArrow functions請勿覆蓋this。在你的情況

run() { 

     this.fancy.checkScope(() => { 
      console.log('Name ', this.name); 
     }); 
     } 

run function並在parameter functionthis是相同的。這意味着在arrow function scopethis指的是this其中定義了arrow function

在高效率的情況下,您不需要額外的變量。您不會使用額外的變量污染本地範圍。在表演中沒有任何影響。

+0

你能解釋一下它將如何提供幫助嗎?以及它是如何不同。 –

+0

@ ZulfiqarJunejo查看最新版本 –

+0

@SurenSrapyan:沒問題,但我認爲OP對「它是否高效?」感興趣?部分。所以問題是這是否比通過將「this」強制轉換爲另一個變量來使用常規函數作用域更有效率。 - 編輯後+1; D – briosheje

相關問題