IIFE引发错误

时间:2013-09-22 15:36:53

标签: javascript

我是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);

3 个答案:

答案 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没有任何关系,你会在你试图以这种方式调用一个新函数时遇到同样的错误。