![](/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.