我知道如何修复此错误,但是有人告诉我这个错误发生的原因的全面解释吗?
var fn = function () {
return fn();
}(); //uncaught TypeError: Property 'fn' of object [object DOMWindow] is not a function
答案 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();
}();
上面的代码是一个变量语句。变量fn
被声明为我设置为undefined
的值(暂时)。
function () {}()
是IIFE。 IIFE是一个立即调用的函数。
IIFE包含一个语句 - return
语句。由于已调用IIFE,因此会立即执行return
语句。
return
语句包含此表达式:fn()
- 它是一个函数调用。但是现在fn
是什么?这是一个功能吗?不,它还是undefined
。调用undefined
值将引发错误。
我认为你可能想要实现这种模式:
var fn = (function () {
var private = 0;
function utility() { ... }
return function () { ... };
})();
现在,fn
是一个可以独占访问private
变量和utility
私有函数的函数。
答案 2 :(得分:1)
你所说的是
function () { return fn(); }
fn
当然,麻烦是当#1发生时,fn
尚未定义,因此函数调用无法使用它; fn
不起作用。它与说“将X的值设置为X的值”相同,这没有意义。
除非您实际上尝试返回调用fn
的结果,否则会更有意义。因此,即使它以某种方式没有抱怨fn
尚未被定义,您仍然会得到一个无限递归,其中函数调用返回返回值的返回值的返回值...
正如Shef所说,这就是所谓的堆栈溢出错误
答案 3 :(得分:-2)
var fn = function () {
return this;
}();
你不能这样写,因为在其他代码之前没有详细说明变量类型函数定义。除了你想做的事情没有任何意义。您可以创建如下函数:
function fn(){
return fn();
}
fn();
但是你会遇到stack_overflow
错误。