簡體   English   中英

調用原型函數時丟失函數上下文

[英]Losing function context in calling prototype function

我試圖弄清楚如何從構造函數獲取函數上下文到其原型函數之一。 但是,當我在原型函數中檢查“ this”值時,它只是將其顯示為“ Object”,而不是調用(ctor)上下文。

所以我有代碼:

function CL(){
    ...
    (stuff)
    ...
    console.log(this);
    protoFunc(this);
}

CL.prototype.protoFunc = function(context) {
  var self = context;
  console.log(context);
  ...
}

調用protoFunc之前的函數上下文是CL。 但是在protoFunc中,它是[Object object]。

如何將函數上下文放入protoFunc?

謝謝。

萊斯

您不能像這樣調用protoFunc ,您需要在this 你沒有收到錯誤嗎? 代碼應為:

function CL(){
    ...
    (stuff)
    ...
    console.log(this);
    this.protoFunc();
}

這會給你正確的this原型方法中-提供CL被正確地稱為new

var instance = new CL();

您甚至不需要這樣做。 嘗試這個:

function CL(name) {
  //for example...
  this.name = name;
}

CL.prototype.protoFunc = function () {
  console.log(this);
};

然后,您將不得不使用構造函數實例化一個對象。

var x = new CL('Bob');
x.protoFunc();
//=> logs {name: 'Bob'}

如果您試圖將ACTUAL CONSTRUCTOR FUNCTION納入您的方法中,那么那里也不需要任何技巧。

CL.prototype.protoFunc = function () {
  var cTor = CL;
  console.log(cTor);
};

這是您要找的東西還是您想要的其他東西?

編輯:

如果要從構造函數中調用原型函數,則應執行以下操作:

function protoFunc() {
  console.log(this);
}

function CL(name) {
  protoFunc.call(this);
}

CL.prototype.protoFunc = protoFunc;

通過調用函數或使用Function.prototype.bind設置函數的this值。

鑒於:

function CL(){
    console.log(this);  // a new object
    protoFunc(this);  // protoFunc doesn't exist on CL's scope chain and will throw an error
}

如果按如下方式調用CL(並假設未使用bind ):

CL()

它的這種價值尚未確定,所以在進入功能在非嚴格模式將設置為全局(窗口)對象。 在嚴格模式下,它將是不確定的

如果使用new調用CL:

var cl = new CL()

那么函數中的對象將引用一個新對象,就像由new Object()創建的一樣,即它是對該實例的引用。 由於默認情況下會返回此新對象,並將其分配給cl ,因此將保留對構造函數this的引用,因此無需保留任何其他引用。

請注意,每次調用CL都會創建一個全新的執行上下文。

如果創建CL的實例,然后調用分配給構造函數原型的方法,例如:

cl.protoFunc()

那么protoFunc中的 這個將是cl

您的聲明:

調用protoFunc之前的函數上下文是CL的上下文

沒道理,大概是在這里您將“上下文”與“ this”混淆了。 如上所述, 是由調用(或綁定)設置的,因此您必須顯示如何調用CL來確定將是什么。

如何將函數上下文放入protoFunc

鑒於在構造函數中的實例和一個函數的這個值是由調用設置:

cl.protoFunc()

會做的工作。

上下文

術語“上下文”已潛入的ECMAScript行話作為化名,這是不幸的。 ECMA-262本質上將執行上下文定義為在輸入函數(或新的全局環境或使用eval)時創建的環境,該環境包括作用域鏈和函數的所有變量(包括其this值)。 您不能引用執行上下文或以任何方式訪問它。

因此,函數的上下文遠不止於此

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM