![](/img/trans.png)
[英]javascript: how to refer to an anonymous function within the function itself?
[英]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.