Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未捕获类型错误:属性';fn';对象的属性[object DOMWindow]不是函数_Javascript_Iife - Fatal编程技术网

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
  • 当然,问题是当#1发生时,
    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是一个可以立即调用的函数

  • 该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 () { ... };
    
    })();