为什么在变量内部执行函数与直接执行函数有区别?

时间:2019-03-27 15:54:43

标签: javascript

为什么当我直接执行功能时-“未跳过”和“跳过”两行都打印到控制台,而当我将功能存储在变量中并执行时,完整功能却没有执行,而我只得到返回函数?

例如:bad()()将返回两个console.log消息,而good()将仅返回第二个消息。

function bad() {
  console.log('didn\'t skip')
  return function() {
    console.log('skipped')
  }
}


var good = bad()


good() // in theory shouldn't this be the same as the execution below?
bad()()

4 个答案:

答案 0 :(得分:0)

只要运行didn't skip函数,就会运行bad行。首先,它在此行上运行:

var good = bad()

那么当你做

good()

它仅运行skipped行,因为包含bad行的didn't skip函数未运行。

bad()()

同时运行。可能会看到正在发生什么,以便在两行之间添加更多日志记录:

    function bad(){
        console.log('didn\'t skip')
        return function(){
            console.log('skipped')
        }
    }

console.log('assigning')
    var good = bad()
console.log('done assigning')

console.log('running good')
good() // in theory shouldn't this be the same as the execution below?
console.log('running bad')
bad()() 

答案 1 :(得分:0)

分配好变量后,将打印第一个控制台日志

var good = bad()

该代码已执行,现在,存储在good变量中的是返回的函数

所以,它与执行bad()()

不同

答案 2 :(得分:0)

目前您称good()console.log("skipped")的功能。 console.log(" didn't skip")部分发生在您进行var good = bad()时。

很难解释,但输出绝对正确。

答案 3 :(得分:0)

当您分配-SNAPSHOT时,该函数将被执行,控制台将记录var good = bad()并返回具有didn't skip的匿名函数。此函数已分配给console.log('skipped')变量。

因此,现在good是与good()返回的匿名函数相同的函数。

因此,致电bad()good() 然后调用console.log('skipped')(显然)会console.log都记录

事件就是这样

var分配->未跳过 good()调用->跳过 bad()呼叫->未跳过,已跳过

bad()