從我的另一個崗位上吃人,這比你想知道的還要多這,這個.
在我開始之前,最重要的是記住Javascript,并且在沒有意義的時候重復(fù)一遍。JavaScript沒有類(ES6)class
是句法糖)。如果什么東西看起來像一個類,這是一個聰明的伎倆。JavaScript對象和功能..(這并不是100%的精確性,函數(shù)只是對象,但有時將它們看作單獨的事物是有幫助的)
這個這,這個變量被附加到函數(shù)中。每當你調(diào)用一個函數(shù),這,這個的值,這取決于調(diào)用函數(shù)的方式。這通常被稱為調(diào)用模式。
在javascript中有四種調(diào)用函數(shù)的方法。您可以將該函數(shù)作為方法,作為功能,作為構(gòu)造器,與應(yīng)用.
作為一種方法
方法是附加在對象上的函數(shù)
var foo = {};foo.someMethod = function(){
alert(this);}
當作為方法調(diào)用時,這,這個將綁定到函數(shù)/方法所屬的對象。在本例中,這將綁定到foo。
作為A函數(shù)
如果您有獨立功能,則這,這個變量將綁定到“全局”對象,幾乎總是窗戶對象在瀏覽器的上下文中。
var foo = function(){
alert(this);
}
foo();
這可能就是你被絆倒的原因但不要難過。許多人認為這是一個糟糕的設(shè)計決策。由于回調(diào)是作為函數(shù)調(diào)用的,而不是作為方法調(diào)用的,這就是為什么您將看到似乎不一致的行為。
很多人通過做這樣的事情來解決這個問題
var foo = {};foo.someMethod = function (){
var that=this;
function bar(){
alert(that);
}}
定義一個變量那,那個指向這,這個..關(guān)閉(一個主題本身的)保持那,那個因此,如果您調(diào)用BAR作為回調(diào),它仍然有一個引用。
注:在use strict
模式如果用作函數(shù),this
不一定是全球性的。(是的)undefined
).
作為一個建設(shè)者
還可以調(diào)用函數(shù)作為構(gòu)造函數(shù)?;谀褂玫拿s定(TestObject),這也是也許是你在做的事,也是你被絆倒的原因.
使用新關(guān)鍵字作為構(gòu)造器調(diào)用函數(shù)。
function Foo(){
this.confusing = 'hell yeah';}var myObject = new Foo();
當作為構(gòu)造函數(shù)調(diào)用時,將創(chuàng)建一個新對象,并且這,這個會被綁在那個物體上。同樣,如果您有內(nèi)部函數(shù)并將它們用作回調(diào),則將它們作為函數(shù)調(diào)用,并且這,這個將被綁定到全局對象。使用這個=這個技巧/模式的變量。
有些人認為構(gòu)造函數(shù)/新關(guān)鍵字是Java/傳統(tǒng)OOP程序員創(chuàng)建類似類的一種方法。
應(yīng)用方法
最后,每個函數(shù)都有一個名為“Apply”的方法(是的,函數(shù)是Javascript中的對象)。應(yīng)用程序可以讓您確定這,這個也允許您傳遞一個參數(shù)數(shù)組。這是一個無用的例子。
function foo(a,b){
alert(a);
alert(b);
alert(this);}var args = ['ah','be'];foo.apply('omg',args);