簡體   English   中英

JavaScript 內部匿名 Function 無法訪問會員?

[英]JavaScript Inner Anonymous Function Cannot Access Member?

我正在嘗試學習如何在 JavaScript 中使用匿名 function。因此,我創建了匿名 function,然后我添加了內部 function、tigerInner(),在 function 中,我嘗試訪問外部 scope 中的成員,但出現未定義的 I 77188 錯誤。

 var tiger = function(name, info) { var name = name;//put this as private member this.behave = info; console.log("tiger: " + name + " " + behave); this.tigerInner = function(){ console.log('name: ' + name); console.log("tigerInner, behave: " + this.behave);//undefined error "this.behave" } } var test = tiger("tiger", "eating"); test.tigerInner();

你沒有得到那個錯誤,而是你得到一個告訴你你正在調用tigerInner undefined的 object,因為tiger沒有返回任何東西......相反你應該返回this

 var tiger = function(name, info) { var name = name;//put this as private member this.behave = info; console.log("tiger: " + name + " " + behave); this.tigerInner = function(){ console.log('name: ' + name); console.log("tigerInner, behave: " + this.behave);//undefined error "this.behave" } return this; } var test = tiger("tiger", "eating"); test.tigerInner();

你的主要問題是:

  1. 您將info分配給this.behave但隨后您使用behave而不是infothis.behave 在您的console.log行中將behave更改為this.behave

  2. 您編寫的代碼像構造函數一樣工作(假設新構造的 object 是this的並且不返回任何內容)但您沒有將其作為構造函數調用 為此,您需要使用new關鍵字: var test = new tiger("tiger", "eating")


此外,您的行var name = name並沒有像您認為的那樣做-它什么也沒做,因為name已經像局部變量一樣工作,而您只是將其分配給自己。 所以你可以刪除那條線。


這是我的建議,固定代碼的樣子:

 var tiger = function(name, info) { this.behave = info; console.log("tiger: " + name + " " + this.behave); this.tigerInner = function(){ console.log('name: ' + name); console.log("tigerInner, behave: " + this.behave); } } var test = new tiger("tiger", "eating"); test.tigerInner();

沒有new的替代方案需要使用並返回您自己創建的新 object - 只需按照其他答案中的建議返回this似乎可行但實際上將您的behavetigerInner屬性放入全局 object 並返回全局 object 本身結束(並且會在嚴格模式下崩潰)。 new的 -less 解決方案如下所示:

 var tiger = function(name, info) { var obj = {}; obj.behave = info; console.log("tiger: " + name + " " + obj.behave); obj.tigerInner = function(){ console.log('name: ' + name); console.log("tigerInner, behave: " + obj.behave); }; return obj; } var test = tiger("tiger", "eating"); test.tigerInner();

暫無
暫無

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

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