我是JavaScript编程的新手。我写了一个IIFE,可以帮助我提高理解力。我的目的是定义一个$函数,当被调用时,它将自己称为构造函数。运行代码时,它会生成错误“Too much recursion”。我不知道问题是什么。
(function() {
//check the global host object
var root = this;
var inside = "inside";
var $ = function () {
return new $(); //this line generates an error 'Too much recursion.'
}
$.check = function(obj) {
console.log(inside);
}
//add the $ to global object
root.$ = $;
}).call(this);
var ins = $();
console.log(ins);
答案 0 :(得分:1)
此行生成错误“递归太多。”
右。您有一个分配给$
符号的函数,该函数调用分配给$
符号的函数。因此,每次调用(无论是直接调用还是通过new
)都会运行该函数中的代码,这会使对其进行另一次调用,依此类推,直到超出引擎的递归意愿为止。为避免这种情况,请$
做其他事情。
答案 1 :(得分:1)
var $ = function () {
return new $(); //this line generates an error 'Too much recursion.'
}
此函数反复调用自身,这就是您看到Too much recursion.
错误的原因。您不能区分常规函数调用和new
调用。
我的目的是定义一个$函数,当被调用时,它将自己称为构造函数。
最简单的方法是明确检查:
var $ = function $() {
if(!(this instanceof $)) return new $();
// ... from this point on, behave as if called via new
}
答案 2 :(得分:0)
这是因为你创造了一个无限循环。通过在返回新的var实例时使用括号,您将递归调用不带参数的函数。我不确定你要完成什么,但是你可能希望让$创建一个新对象“{}”,然后你可以从该引用扩展方法。查看单例模式,这将允许您创建一些新的实例。
*编辑,为了清楚你的问题与它是一个IIFE没有任何关系,你会在你试图以这种方式调用一个新函数时遇到同样的错误。