簡體   English   中英

無論外部變量如何變化,如何在函數中引用自身?

[英]How to refer itself in a function regardless of extenal variable changes?

我有一個定義了其他函數的函數:

var A = function(n) {
  console.log(n + A.num());
}
A.num = function() {
  return 5;
}

我想將名稱更改為B並刪除A

var B = A;
A = undefined;

但是,當我執行B() ,它會拋出一個錯誤:“無法讀取未定義的屬性 'num'”,這是完全正常和預期的。

我該如何處理?

PS :任何認為用this.num()改變A.num()都行不通

您始終可以使用其顯式名稱(如果有)來引用當前函數。

因此,更改定義,命名函數,並使用它來引用它:

 var A = function currentFunction(n) { console.log(n + currentFunction.num()); } A.num = function() { return 5; } var B = A; A = undefined; B(10); //15 console.log(typeof currentFunction) //undefined, function name is local

注意:如果函數被隱式命名,上述方法將不起作用,但如果函數通過fn.name重命名,則將繼續fn.name


或者,如果函數不是箭頭函數,您也可以使用arguments.callee ,即使使用匿名函數也可以使用,但不建議使用它:

 var A = function (n) { console.log(n + arguments.callee.num()); } A.num = function() { return 5; } var B = A; A = undefined; B(10); //15

不幸的是,以上都不適用於箭頭函數,如果您想引用自身,請改用命名綁定函數表達式。

其實這很正常,因為在js中你不能真正復制對象

// Define object bar
var bar = {
   x : 'Hi'
}
console.log(bar.x);  //Hi

// Assign it to foo
var foo = bar;
console.log(foo.x);  //Hi

//But
foo.x = 'Hello!! Im foo.';
console.log(foo.x);  //Hello!! Im foo.
console.log(bar.x);  //Hello!! Im foo.

bar.x = "Nice to meet you foo!!";
console.log(foo.x);  //Nice to meet you foo!!
console.log(bar.x);  //Nice to meet you foo!!

你必須返回一個與上一個值相同的新值

var foo = {...bar};

這不起作用,因為 B 總是從不存在的 A 調用“num”,切斷奇偶校驗的一種方法是對初始函數進行字符串化,然后在將“A”替換為“A”后使用函數構造函數創建克隆'B' 但告訴我更多你為什么面臨這個問題?

 var A = function(n) { if(!this.num){ console.log("This is not available coz obj is not created"); console.log("Below error is for testing purpose"); } let a=this.num(n); console.log(a); } //use prototype here //A.num = function() { A.prototype.num=function(n){ return n+5; } //use new to create object new A(5); var B = A; A = undefined; //use new to create object new B(6); B(5);//lets try without using new keyword
 .as-console-wrapper { max-height: 100% !important; top: 0; }

暫無
暫無

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

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