2016-05-13 31 views
1

我經常看到Javascript代碼,其中this被分配給一個變量用於引用對象的當前實例。'this'在被使用之前被分配給一個var?

var me = this; 
me.someproperty_or_method 

他們爲什麼要這樣編碼? ?這裏是一個更完整的代碼片段,

var Preload = function(game){}; 

Preload.prototype = { 

    init: function() { 
    var me = this; 

    var style = { 
     font: "32px Arial", 
     fill: "ffffff", 
     align: "center" 
    }; 



this.text = this.add.text(me.game.world.centerX, me.game.world.centerY, "Loading: 0%", style); 
    this.text.anchor.x = 0.5; 
    } 

    preload: function(){ 
    this.game.load.text('dictionary', 'assets/dictionary.txt'); 

    }, 

    create: function(){ 
    this.game.state.start("Main"); 
    } 
} 

我很確定這不是重複的,在其他帖子上給出的答案是不確定的。

+2

'me'可能被用在回調函數中,在這種情況下'this'將會有所不同 – Fabricator

+0

這段代碼沒有任何意義。他們應該在這裏使用'this.someproperty_or_method'。如果他們需要一個'var me'來引用這個'this'的值,那麼這是一個單獨的事情。 – Bergi

回答

2

this與函數的執行上下文有關,該函數的執行上下文是函數執行期間確定的值,具體取決於函數的調用方式。

對於嵌套函數,您可能需要在內部函數中訪問外部函數的this而不是this。將它分配給一個變量,內部函數可以訪問外部函數的this

function foo(){ 
    var foosThis = this; 

    function bar(){ 
    var barsThis = this; 

    // `this` is bar's `this` which is null. 
    // You can't access foo's `this` via `this` 
    // But you can access foo's `this` via foosThis 
    } 

    // Call bar with null as context 
    bar.call(null); 
} 

// Call foo with an object as context 
foo.call({}); 

function.call只是功能的上下文可以改變的許多方式之一。

+1

重新「*這屬於函數的上下文*」應該可能是「*這屬於函數的**執行**上下文*」。 ;-) – RobG

1

它通常用於保存另一個上下文。如果您想將另一個上下文傳遞到另一個塊中,則可以使用bind()。例如:

function People() { 
    // current `this` is context of `People` 
    var I = this; 

    var beHappy = function() { 
     // current `this` is context of `beHappy` 
     var me = this; 

     console.log("=== beHappy()"); 
     console.log("I and me =", (I === me)); // false 
     console.log("this and me =", (this === me)); // true 
    }; 

    var beSad = function() { 
     // current `this` is context of `beSad` 
     var me = this; 

     console.log("=== beSad()"); 
     console.log("I and me =", (I === me)); // true 
     console.log("this and me =", (this === me)); // true 
    }.bind(this); 

    var beSleepy = function() { 
     console.log("=== beSleepy()"); 
     console.log("this and I =", (this === I)); // false 
    }; 

    beHappy(); 
    beSad(); 
    beSleepy(); 
} 

new People(); 

正如你可以在beHappy看到的,I值大於me不同,因爲它包含另一個上下文。但在beSad上,兩者都持有相同的上下文(參考People)。

+1

只有'var me = this;'在你的例子中不*保存另一個上下文。你應該省略它,直接比較'I === this'。 – Bergi

+1

這個例子只是爲了比較,我希望OP會更容易理解它 – nvl

+2

是的,但它也是一個很好的例子,其中'var me'是不必要的並且確實被使用:-) – Bergi

1

問:「? '這個' 被使用之前被分配給一個變種」


答:上下文值總是存在:實際,電流和最新的。

您可以從任何您希望的上下文中指定它,並將它的過去值的引用存儲在任何位置或任何時候到達其處理位置。

事實上:分配實際上是在讀取/執行時發生的 - 不是在&未被使用之前發生。

+1

只是回答這個問題,不要重複它:-) – Bergi

+1

謝謝@Bergi,我一直認爲提供上下文到您的答案有助於保持答案的清晰度和含義,特別是當它定位的方式低於問題的可見部分。我認爲這是一個很好的做法,我希望鼓勵其他人使用它。 :) –

+0

哦,我自己一直在這樣做,引用(blockquote)我正在討論的問題部分。但重複問題的*標題*是無用的。 – Bergi

相關問題