未捕获的TypeError:对象[对象DOMWindow]的属性'fn'不是函数

时间:2011-09-11 10:38:00

标签: javascript iife

我知道如何修复此错误,但是有人告诉我这个错误发生的原因的全面解释吗?

var fn = function () {
  return fn();
}(); //uncaught TypeError: Property 'fn' of object [object DOMWindow] is not a function

4 个答案:

答案 0 :(得分:3)

在全局范围中使用var关键字时,声明的变量将成为全局对象的属性。在Web浏览器中,全局对象是window对象,它本身是DOMWindow()的实例。因此,使用这些知识,我们可以将代码重写为:

window.fn = function () {
    return window.fn();
}();

取消初始任务,我们有

(function () {
    return window.fn();
})();

...定义了一个匿名函数,其中调用了window.fn()。但是,在此代码运行时,window.fn不是函数(并且永远不会),因此抛出异常是因为即使它没有内部{{1}也会尝试调用它国旗。

如果你立即执行匿名函数,那么[[Call]]就是一个函数:

window.fn

答案 1 :(得分:2)

var fn = function () {
  return fn();
}();
  1. 上面的代码是一个变量语句。变量fn被声明为我设置为undefined的值(暂时)。

  2. function () {}()IIFE。 IIFE是一个立即调用的函数。

  3. IIFE包含一个语句 - return语句。由于已调用IIFE,因此会立即执行return语句。

  4. return语句包含此表达式:fn() - 它是一个函数调用。但是现在fn是什么?这是一个功能吗?不,它还是undefined。调用undefined值将引发错误。


  5. 我认为你可能想要实现这种模式:

    var fn = (function () {
    
        var private = 0;
    
        function utility() { ... }
    
        return function () { ... };
    
    })();
    

    现在,fn是一个可以独占访问private变量和utility私有函数的函数。

答案 2 :(得分:1)

你所说的是

  1. 执行函数function () { return fn(); }
  2. 将返回的值存储在名为fn
  3. 的变量中

    当然,麻烦是当#1发生时,fn尚未定义,因此函数调用无法使用它; fn不起作用。它与说“将X的值设置为X的值”相同,这没有意义。

    除非您实际上尝试返回调用fn的结果,否则会更有意义。因此,即使它以某种方式没有抱怨fn尚未被定义,您仍然会得到一个无限递归,其中函数调用返回返回值的返回值的返回值...
    正如Shef所说,这就是所谓的堆栈溢出错误

答案 3 :(得分:-2)

var fn = function () {
  return this;
}();

你不能这样写,因为在其他代码之前没有详细说明变量类型函数定义。除了你想做的事情没有任何意义。您可以创建如下函数:

function fn(){
    return fn();
}

fn();

但是你会遇到stack_overflow错误。