0

我是 JavaScript 编程的新手。我写了一个 IIFE 来帮助我提高理解。我的意图是定义一个 $ 函数,当调用它时,它会调用自己作为构造函数。运行代码时,会生成错误“递归过多”。我不知道问题是什么。

(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);
4

3 回答 3

1

此行生成错误“递归过多”。

正确的。您有一个分配给$符号的函数,它调用分配给$符号的函数。因此,每次调用(无论是直接调用还是通过调用new)都将运行该函数中的代码,然后再次调用它,依此类推,直到超出引擎的递归意愿。为避免这种情况,$请做其他事情。

于 2013-09-22T15:39:56.847 回答
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 
}
于 2013-09-22T16:12:30.353 回答
0

这是因为您创建了一个无限循环。通过在返回新的 var 实例时使用括号,您将递归地调用不带参数的函数。我不确定您要完成什么,但您可能希望 $ 创建一个新对象“{}”,然后您可以扩展该引用的方法。查看单例模式,这将允许您创建某些东西的新实例

*编辑,只是为了清楚你的问题与它是一个 IIFE 没有任何关系,你会在任何地方尝试以这种方式调用自身的新函数时遇到同样的错误。

于 2013-09-22T15:44:05.940 回答