2014-11-24 38 views
3

我從taylormcgann拿起這個例子。在我問我的問題之前,讓我聲明我是JavaScript新手,並且在應對這些概念方面遇到困難。方法與函數調用模式

在我提到的鏈接,這裏的方法調用模式是如何定義的:

var person = { 
    name: 'Calvin', 
    age: 25, 
    greet: function() { 
     alert('My name is ' + this.name + '.'); 
    } 
}; 
person.greet(); //My name is Calvin. 

很公平。 greet()被定義爲一種方法,並按照這種方式被訪問。現在來函數調用模式:

// Add a new method to person 
person.calculateAge = function (yearsFromNow) { 
    var self = this; 

    function yearsOld() { 
     return self.age + yearsFromNow; 
    } 

    alert('I will be ' + yearsOld() + ' years old ' + yearsFromNow + ' years from now.'); 
} 
person.calculateAge(10); //I will be 35 years old 10 years from now. 

我不明白如何在地球上這成爲函數調用?我可以測試和確定this對象是指window,但調用語法與上面相同。這個真的是方法和函數調用模式之間的區別,一個是在對象內部定義的,一個是,種類,外部?我來自C/C++的背景,所以你可以理解這對我來說有多驚人。

任何想法是最受歡迎的。

+0

如果刪除了'yearsOld'功能,只需將值賦值給一個變量,比如'VAR yearsOld = this.age + yearsFromNow',豈不更有意義嗎? – Jhecht 2014-11-24 06:45:48

+0

沒有。我仍然會被'person.calculateAge ='難住。 。 。不能擺脫功能附着在物體上的感覺,因此是一種方法。 :P – dotslash 2014-11-24 07:39:45

+0

這是一種方法。 – Jhecht 2014-11-24 08:08:05

回答

2

我會爲您提供一個簡單的例子,它將區分方法調用和函數調用。

var x = 3; 

var foo = { 
    x: 2, 
    baz: { 
     x: 1, 
     bar: function() { 
      return this.x; 
     } 
    } 
} 

var go = foo.baz.bar; 

alert(go());//3 
alert(foo.baz.bar());//1 

當你調用方法inovcation「這個」結合當前的對象,當你調用函數調用模式「這個」綁定到全局對象。上面的例子將簡單解釋你仔細閱讀的所有事情。

在你的例子中都是方法調用模式。

+0

非常好的例子。 JS語法真的很難適應,但我想我會習慣它。 :) – dotslash 2014-11-24 07:48:31

+0

也很高興知道該教程是不正確的! – dotslash 2014-11-24 07:49:05

+1

我建議你閱讀道格拉斯克羅克福德的書籍「JavaScript:The Good Parts」 – murli2308 2014-11-24 07:51:05

2

person.calculateAgeperson.greet之間沒有區別,因爲兩者都將作爲屬性添加到「人物」對象。然而,作者正試圖解釋在變化的執行上下文中如何設置'this'關鍵字,這通常不取決於函數的定義位置,而是取決於函數的調用方式。
在'this'以上兩種情況下,關鍵字將被設置爲'person'對象,因爲這些方法正由'person'調用。然而,在調用yearsOld()方法時,它不會再指向'person'對象,因爲它被person.calculateAge調用。
我建議看看Mozilla Dev link瞭解'this'。

+0

您已添加有趣的視角。是的,確實情況是'yearsOld()'被區別對待。感謝您指出了這一點! :) – dotslash 2014-11-24 08:03:29

0

猜測你是如何考慮這個例子的。

如果你在想,person.greet();是方法調用,person.calculateAge(10);是函數調用,那麼你錯了,都是方法調用。

我想是什麼,在第二種方法calculateAge你叫yearsOld的方式是一個函數調用模式。

對於JS閱讀正確的東西更重要。看看this

這是一個函數調用模式:

var sum = add(3, 4); // sum is 7 

作爲add方法沒有任何對象的一部分,像例如在我們正在考慮yearsOld功能。