function outer(abc) {
  this.abc = abc;
   return function inner() {
    this.abc = abc;
    return this.abc;
  }
}

在上面的代码中,我不能像下面这样计算外部函数

  var obj = new outer(123);
   console.log(obj.abc)
//here obj.abc get undefined

但当删除外部函数的返回关键字时,以下代码可以正常工作

function outer(abc) {
      this.abc = abc;
       function inner() {
        this.abc = abc;
        return this.abc;
      }
    }
 var obj = new outer(123);
       console.log(obj.abc)

我还有一个问题是,为什么我不能像下面这样创建返回函数的对象?

function outer(abc) {
      this.abc = abc;
       return function inner() {
        this.abc = abc;
        return this.abc;
      }
    }
var obj2= new outer(11)();
console.log(obj2.abc)

推荐答案

如果使用带有new的函数(从而创建了一个对象实例)并从该函数返回,则返回值将用作new的结果,而不是该对象实例.当您返回一个函数并在没有绑定到上下文的情况下直接调用它时,它的上下文在浏览器中为window:

如果构造函数返回非原语,则此返回值将成为整个新表达式的结果.否则,如果构造函数不返回任何内容或返回原语,则返回newInstance.(通常,构造函数不返回值,但它们可以 Select 这样做以覆盖正常的对象创建过程.) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

function outer(abc) {
  this.abc = abc;
   return function inner() {
    console.log(this);
    this.abc = abc;
    return this.abc;
  }
}

console.log((new outer)());

要修复您的代码,只需删除对this的依赖:

function outer(abc) {
  this.abc = abc;
   return function inner() {
    return abc;
  }
}

console.log((new outer(123))());

Anyway I think your pattern here doesn't make much sense. Seems you want to achieve a pattern that would be done much cleaner and easier.
And to be more specific @VLAZ has pointed that this.abc = abc; in the outer class is pointless since not used later, that I noticed also but avoided to gain some focus on it. Ok as a part of JS learning though...

@silentmantra请澄清下面代码中的一个疑问,我一定会接受您的回答.为什么我不能创建内部函数的对象,而它不返回任何东西.函数OUTER(Abc){this.abc=abc;返回函数INTERNAL(){this.abc=abc;}}var RESULT=new out(23)();sole.dir(Result);

如上所述,当您调用返回的函数时,您将丢失this上下文,它将变为window(默认上下文).所以基本上返回了window.abs,而你赋值给它之后就是11了. 而你最后的console.log(obj2.abc)没有意义,因为你试图得到一个数字的props :

function outer(abc) {
      this.abc = abc;
       return function inner() {
        this.abc = abc;       
        return this.abc;
      }
    }

var obj2= new outer(11)();

console.log(obj2)

console.log(obj2.abc) // 11 doesn't have 'abs' property

console.log(window.abc) // oops, but window has

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

Javascript相关问答推荐

Tailwind-Elements React集成到ClojureScript

为什么剧作家在导航时会超时?

使脚本兼容于其他YouTube URL格式

Math.random超出了最大调用堆栈

如何将特定的字符串类型转换为TypScript中的字符串?

二维数组,过滤并返回带有索引而不是值的新数组

如何按预期聚合SON数据?

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

Google图表时间轴—更改hAxis文本 colored颜色

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

成功完成Reducers后不更新状态

如何为我的astro页面中的相同组件自动创建不同的内容?

处理时间和字符串时MySQL表中显示的日期无效

无法访问Vue 3深度监视器中对象数组的特定对象值'

查询参数未在我的Next.js应用路由接口中定义

Webpack在导入前混淆文件名

将基元传递给THEN处理程序

为什么延迟在我的laravel项目中不起作用?

使用API调用的VUE 3键盘输入同步问题

AG-GRIDreact 显示布尔值而不是复选框