Javascript 未捕获类型错误:属性';fn';对象的属性[object DOMWindow]不是函数
我知道如何修复这个错误,但有人告诉我为什么会发生这个错误的全面解释吗Javascript 未捕获类型错误:属性';fn';对象的属性[object DOMWindow]不是函数,javascript,iife,Javascript,Iife,我知道如何修复这个错误,但有人告诉我为什么会发生这个错误的全面解释吗 var fn = function () { return fn(); }(); //uncaught TypeError: Property 'fn' of object [object DOMWindow] is not a function 您不能编写它,因为变量类型函数定义没有在其他代码之前详细说明。此外,你想做的事毫无意义。您可以创建如下函数: function fn(){ return fn();
var fn = function () {
return fn();
}(); //uncaught TypeError: Property 'fn' of object [object DOMWindow] is not a function
您不能编写它,因为变量类型函数定义没有在其他代码之前详细说明。此外,你想做的事毫无意义。您可以创建如下函数:
function fn(){
return fn();
}
fn();
但是您将遇到一个堆栈溢出错误。您所说的是
function(){return fn();}
fn
fn
尚未定义,因此函数调用无法使用它<代码>fn不起作用。这与说“将X的值设置为X的值”是一样的,这是没有意义的
除了您实际上试图返回调用fn
的结果,这就没有什么意义了。因此,即使它没有抱怨fn
尚未定义,您仍然会得到一个无限递归,其中函数调用返回返回值的返回值,返回值的返回值…正如Shef所说,这就是所谓的堆栈溢出错误当您在全局范围中使用var关键字时,声明的变量将成为全局对象的属性。在web浏览器中,全局对象是
窗口
对象,它本身是DOMWindow()
的实例。因此,利用这些知识,我们可以重写您的代码,使其如下所示:
window.fn = function () {
return window.fn();
}();
除去最初的任务,我们有
(function () {
return window.fn();
})();
…它定义了一个匿名函数,在该函数中调用window.fn()
。但是,在此代码运行时,window.fn
不是函数(也永远不会),因此会引发异常,因为您试图调用它,即使它没有内部的[[Call]]
标志
如果取消立即执行匿名函数,则window.fn
将是一个函数:
var fn = function () {
return fn();
}
fn(); //-> infinite loop
fn
被声明为一个it's值,我设置为undefined
(目前)function(){}()
是一个函数。IIFE是一个可以立即调用的函数return
语句。由于IIFE已被调用,因此会立即执行return
语句return
语句包含以下表达式:fn()
-这是一个函数调用。但是此刻什么是fn?它是一个函数吗?没有。它仍然是未定义的。调用undefined
值将抛出错误我假设您可能希望实现以下模式:
var fn = (function () {
var private = 0;
function utility() { ... }
return function () { ... };
})();
现在,
fn
是一个独占访问private
变量和实用程序
私有函数的函数。-1(1)没有回答问题,即“为什么我不能写这个?”而不是“我应该写什么?”。(2) 我认为这与OP的代码没有任何关系,您的版本只是编写var fn=window的一种精心设计的方式
@delnan:我希望你现在满意了。
var fn = function () {
return fn();
}();
var fn = (function () {
var private = 0;
function utility() { ... }
return function () { ... };
})();