2012-01-11 66 views
3

我有2個街區的代碼,一個不工作,一個工作,因爲我分配一個=這和使用,在我的函數而不是這個。有人能幫助我理解爲什麼這樣。這有助於瞭解如何在JavaScript中使用對象中的函數來訪問變量,以及「this」的性質,如果我說得對(如果不是,請賜教)。謝謝!理解「這種」在Javascript

var add = function (x, y) { 
    return x + y; 
    } 

var myObject = { 
    value: 0, 
    increment: function (inc) { 
    this.value += typeof inc === 'number' ? inc : 1; 
    } 
}; 

myObject.double2 = function() { 
    // var that = this; 

    var helper = function() { 
    this.value = add(this.value, this.value) 
    }; 

    helper(); 
}; 

myObject.increment(100); 
document.writeln(myObject.value); // Prints 100 
myObject.double2(); 
document.writeln('<BR/>'); // Prints <BR/> 
document.writeln(myObject.value); // Prints 100, **FAILS** 

而且修改後的代碼:

var add = function (x, y) { 
    return x + y; 
    } 

var myObject = { 
    value: 0, 
    increment: function (inc) { 
    this.value += typeof inc === 'number' ? inc : 1; 
    } 
}; 

myObject.double2 = function() { 
    var that = this; 

    var helper = function() { 
    that.value = add(that.value, that.value) 
    }; 

    helper(); 
}; 

myObject.increment(100); 
document.writeln(myObject.value); // Prints 100 
myObject.double2(); 
document.writeln('<BR/>'); // Prints <BR/> 
document.writeln(myObject.value); // Prints 200 - **NOW IT WORKS** 
+0

'this'指的是本地執行上下文。 (我100%確定別人能說得更好,然後我)。你的'''''''''''變量是一個閉包,它捕獲'this'的值,以便在函數調用中引用它,在未來的某個時候。 – asawyer 2012-01-11 03:49:50

回答

4

第一個不起作用,因爲當每個功能的this取決於它是如何被調用。

首先,你做myObject.double2()this = myObject。但是在double2之內,你自己撥打電話helper(),並且沒有任何對象在你的調用下(它不是myObject.helper())。因此this默認爲global對象(或在瀏覽器中爲window對象)。

在第二個示例中,您「捕獲」了對myObjectthat=this=myObject)的引用等that.value=myObject.value

+0

感謝!這是一個非常明確的描述,對我來說很有意義。 – zallarak 2012-01-11 03:59:25

2

我覺得這link將大大有助於您瞭解對象的JavaScript中的差異和私有成員,以解決您的問題,請大家看看私人部分。希望能幫助到你!

+0

我想你忘了鏈接 – xbonez 2012-01-11 03:50:56

+0

感謝您的評論,我沒有看到你的鏈接,雖然 – zallarak 2012-01-11 03:51:23

+0

它的單詞「鏈接」 – Skuld 2012-01-11 04:05:45

1

Mozilla有這方面的一些良好的閱讀。如果您希望在不將this分配到that的情況下工作,則始終可以使用call

例子:jsfiddle.net/5azde/

+0

tx爲鏈接和示例代碼。 – zallarak 2012-01-11 04:00:34

0

你可以永遠記住這一點:

當一個對象的函數被調用,對象也將被這個值(合格的情況下,分別屬於'window'和'myObject'的'add'和'increment'函數)。如果函數不屬於任何對象,那麼窗口(或全局)將作爲此值傳遞(如示例代碼中的函數助手)。

而且我很高興看到一個純粹的JS問題。沒有jQuery,沒有CSS,沒有DOM選擇器。哈哈。

願意幫忙嗎? :-)

+0

請注意,每個函數的這個值是定義的,並且在函數形成時不可更改。但是你可以用'call'或'apply'來修改'this'的值。 – trinity 2012-01-11 06:22:07