当前位置: 首页 > 知识库问答 >
问题:

javascript - 这个简单的JS代码为啥还是会报错呢?

席烨
2023-06-06
window.my = {};
window.my.init = function init(){};

function start(){
    init()
} 

start()

找不到init?
那起的函数名有什么用?

共有7个答案

阎承
2023-06-06

因为你可能需要这么用(递归)

window.my.init = function init(x){
    if (!x) {
        init(x+1)
    }
};
公孙志
2023-06-06

因为你定义了一个叫做init的函数,赋值给了window.my.init,然后流程就结束了
并没有把叫做init的函数,定义到全局变量中

邢高澹
2023-06-06
  function init () { };
  window.my = {};
  window.my.init =init

  function start () {
    init()
  }

  start()

这样就好了
原本报错是因为window.my.init = function init () { };只是代表给my定义一个init的方法, 并不是先定义一个init的全局函数然后赋值给my, 也可以直接写作: window.my.init = () => {},

通俊发
2023-06-06

因为你的 init 函数是在 window.my 下面啊。并不是在 window 下面。
稍微修改一下就好了。

window.my = {};
window.my.init = function init(){};

function start(){
-    init()
+    my.init() 
} 

start()

或者

window.my = {};
- window.my.init = function init(){};
+ window.init = function init(){};

function start(){
    init()
} 

start()

补充回答,对于为什么 window.my.init = function init(){}; 这种函数表达式中申明的具名函数问题不可在外部被调用。
其实和规范有关(可能因为作用域?),这个我并不是很了解,可能后面会有其他大佬可以解答。
如果你想使用也是可以的,以下是一个例子

var fn1 = function fn0(n) {
  if (n === 0) {
    return 1;
  } else {
    // 如果在函数内调用则是可以的
    return n * fn0(n - 1);
  }
};
fn1(10)
// 3628800

// 但是如果你直接调用 fn0() 则会提示异常
fn0()
// Uncaught ReferenceError: fn0 is not defined
羿博延
2023-06-06

注意区分函数和函数表达式,它们还是有一些区别

何超英
2023-06-06
my = {};
my.init = function init(){};

function start(){
  my.init();
}

start();
窦啸
2023-06-06
window.my.init = function init(){};

这样的语句叫 函数表达式,而不是 函数声明,他们是有区别的,见 MDN 上关于函数表达式的 name 的介绍:

函数名称。可被省略,此种情况下的函数是匿名函数(anonymous)。函数名称只是函数体中的一个本地变量。

以及下面的

如果你想在函数体内部引用当前函数,则需要创建一个命名函数表达式。然后函数名称将会(且只会)作为函数体(作用域内)的本地变量。这样也可以避免使用非标准的 arguments.callee 属性。

说白了, 这里的 init ,就只是让你作为在这个函数内部进行引用的。


引用一下 ECMA-262 中的

The BindingIdentifier in a FunctionExpression can be referenced from inside the FunctionExpression's FunctionBody to allow the function to call itself recursively. However, unlike in a FunctionDeclaration, the BindingIdentifier in a FunctionExpression cannot be referenced from and does not affect the scope enclosing the FunctionExpression.
  • 函数表达式 - JavaScript | MDN
  • ECMAScript® 2024 Language Specification
 类似资料: