JavaScript中如何从子函数a.v内不直接写a()调用函数a
可行解决方案
- 方案1:利用实例的
constructor属性(适用于a作为构造函数通过new调用的场景)
方法v是挂载在构造函数实例上的,所有实例默认的constructor属性都指向构造函数本身,不需要直接引用a标识符就能调用:
function a(){ alert("1"); this.v=function(){ // 直接通过实例的constructor访问构造函数本身 this.constructor(); }; } // 测试代码 const instance = new a(); instance.v(); // 触发a执行,弹出1
注意:如果手动修改了实例的constructor属性,该方案会失效。
- 方案2:用
arguments.callee缓存函数自身(兼容非严格模式下的所有调用场景)arguments.callee永远指向当前正在执行的函数本体,不需要依赖外部标识符:
function a(){ // 缓存当前函数本体 const currentFunc = arguments.callee; alert("1"); this.v=function(){ currentFunc(); }; }
注意:该语法在ES5严格模式下被禁用,无法使用。
- 方案3:命名函数表达式(兼容所有场景,无严格模式限制)
把函数声明改成命名函数表达式,函数内部的名字仅在函数作用域内生效,不需要依赖外部的a标识符:
const a = function innerA(){ alert("1"); this.v=function(){ // innerA仅在当前函数作用域内可访问,不会和外部标识符耦合 innerA(); }; }
该方案无严格模式限制,也不会被实例属性篡改影响,适用范围最广。
内容的提问来源于stack exchange,提问作者darth vader
相关产品推荐
相关产品推荐

