Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 为什么在变量内部执行函数与直接执行函数有区别?_Javascript - Fatal编程技术网

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

Javascript 为什么在变量内部执行函数与直接执行函数有区别?,javascript,Javascript,为什么当我直接执行函数时,“没有跳过”和“跳过”两行都会打印到控制台,而当我将函数存储在变量中并执行它时,不会执行完整的函数,而我只得到返回函数 例如:bad()将同时返回console.log消息,good()将只返回第二条消息 函数坏(){ console.log('没有跳过') 返回函数(){ console.log('跳过') } } var good=bad() good()//理论上这不应该与下面的执行相同吗? bad()每当运行bad函数时,没有跳过运行的行。首先,它在这条线上运

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

例如:bad()将同时返回console.log消息,good()将只返回第二条消息

函数坏(){
console.log('没有跳过')
返回函数(){
console.log('跳过')
}
}
var good=bad()
good()//理论上这不应该与下面的执行相同吗?

bad()
每当运行
bad
函数时,
没有跳过运行的
行。首先,它在这条线上运行:

var good = bad()
那么当你这么做的时候

good()
它只运行
跳过的
行,因为包含
未跳过的
行的
坏的
函数没有运行

bad()()
两者都有。这可能有助于了解在两行之间添加更多日志记录的情况:
函数坏(){
console.log('没有跳过')
返回函数(){
console.log('跳过')
}
}
console.log('assigning')
var good=bad()
console.log('done assigning')
console.log('running good')
good()//理论上这不应该与下面的执行相同吗?
console.log('running bad')

bad()()
当您分配好的变量时,会打印第一个控制台日志

var good = bad()
代码被执行了,现在,存储在good变量中的是返回的函数


因此,它与调用
good()
good()时的执行bad()()

不同,good是
console.log(“跳过”)
的一个函数。当您执行
var good=bad()
时,出现了
console.log(“未跳过”)
部分


这很难解释,但输出完全正确。

当您指定函数执行时,console会记录
没有跳过的
,并返回具有
console.log('skipped')
的匿名函数。此函数分配给
good
变量

现在,
good()
是一个函数,它与
bad()
返回的匿名函数相等

因此调用
good()
console.log('skipped')
然后调用
bad()
将(显然)同时记录这两个命令

所以事件是这样的

var赋值->没有跳过 好的()调用->跳过 错误()调用->未跳过,已跳过

函数坏(){
console.log('没有跳过')
返回函数(){
console.log('跳过')
}
}
var good=bad()//控制台日志没有跳过
good()//已跳过控制台日志

bad()()//控制台日志没有跳过,跳过了
在我看来很好……我编辑了您的问题,以便我们可以运行它。我在日志中看到两条
没有跳过
和两条
跳过的
消息。因此,当您运行
var good=bad()
时,您将获得第一个日志,当您运行
good()
时,您将获得第二个日志,因为
bad()
将执行第一个
控制台。log
然后返回一个函数。调用第二个函数执行第二个
console.log()
Well good将只运行第二个函数,因为您已经运行了bad。。IOW:
var good=bad()//bad已经在这里运行了
,所以当函数存储在变量中,并且这些函数被这些变量再次执行时,完整的函数不会执行吗?只有返回函数中存储了什么?是的,没错,但是你也应该阅读闭包,它会帮助你理解@AndrewTang,很高兴我能提供帮助。如果这个答案解决了你的问题,请评分并接受。谢谢:d