关于setTimeout参数问题

function func() {
    setTimeout(function func2() {
        console.log(2);
    })
    func2()
}
func();

这段代码报错。为何?
func2是在func内定义的吗?如果是在func定义的,为什么在func调用会报错呢?

阅读 4k
6 个回答

这是一个函数表达式(FunctionEpxression)。

跟函数声明(FunctionDeclaration)不同,函数表达式中的函数名仅在改函数表达式的函数体内部可用。

function func() {
    setTimeout(function func2() {
        console.log(2);
    })
    func2()
}
func();

等同于

function func() {
    var anonymouseFunc1 = function func2() {
        console.log(2);
    };
    setTimeout(anonymouseFunc1);
    func2();
}
func();

func2这个名字只在方法anonymouseFunc1定义内有效

作用域链了解一下。。。func2严格来说实在setTimeout中定义的,所以你在func中执行报错,是没有毛病的;

function func() {
    function func2() {
        console.log(2);
    }
    setTimeout(func2,1000)

}
func();

你把func2(),单独写在外面,然后定时器调用就行了

是函数表达式(FunctionEpxression)

函数声明需要以以下形式,

// 函数表达式
var f = function() {
      console.log(1);  
} // 直接声明
function f (){
     console.log(2);
}

生成语法树:https://esprima.org/demo/pars...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏