javascript - 返回函数的类实例

标签 javascript

我只是在玩 JavaScript 并创建构造函数,我遇到了这段令人困惑的代码。

var foo = function(){
   this.x = 1;
   return function(){
      return this.x;
   }
}
var x = new foo();
console.log(x);

我为此执行了以下操作:

console.log(x); // The given output is expected for this line of code
console.log(x());
console.log(x()());
console.log(x()()());

以上所有内容都给了我与以下相同的输出:

function (){
   return this.x;
}

有人可以解释一下上面的代码中发生了什么吗? 我无法为这个问题给出一个合适的标题。对此感到抱歉。

注意:我知道 JS 中的构造函数。上面的代码只是出于好奇。

最佳答案

长话短说 - 它没有做任何有用的事情。

如果构造函数返回一个对象,则 new 表达式生成的值就是该值而不是构造的对象。因此,您获得的不是一个 foo 实例,而是一个返回 this.x 的函数。

看起来这段代码正在尝试生成一个函数,该函数返回所创建对象的 this.x 值,但这不是它正在做的事情。由于您自己调用 x() ,因此 this.x 实际上引用了 global x 变量,因此,无论您调用 x()()() 多少次,它都只会返回自身。

如果您使用了 x 以外的任何变量名称,并且没有创建 x 变量(例如 y),则 y () 只会返回 undefined,而 y()() 会产生 ReferenceError。

在严格模式下,这也会更快失败,因为当您尝试调用函数时,函数内的 this 将引用 undefined

关于javascript - 返回函数的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29345691/

相关文章:

javascript - 原型(prototype)到 jQuery : Mindset migration?

javascript - jsPDF 服务器端 (node.js) 使用 node-jspdf

javascript - 如何创建响应式导航栏?

javascript - 表单提交时 setTimeout 返回 'not a function' 错误

javascript - Cordova 插件不适用于 ionic

javascript - 如何对对象值数组求和并将它们分配给相关的键名

javascript - 添加额外信息(版权声明/阅读更多链接)以复制文本并保留格式(换行符和颜色)

javascript - 如何处理流中对象的新属性

javascript - 预期的动态类型字符串',但 typeint64 react native

javascript - jquery检测输入焦点