了解"副作用"在Javascript中与一等函数有关

时间:2017-06-01 00:47:39

标签: javascript scope first-class-functions

我遇到了一个特别有趣的案例,我认为这是Javascript中的副作用。

我试图围绕范围和功能是一等公民的事实。如果我走在正确的轨道上,请告诉我,如果这是一个新手问题,请原谅我。

参考以下代码:

let mrGlobal = "mrGlobal";
let drSideEffect = function() {
   mrGlobal = "mrGlobal has been acting weird lately";
}

function main(firstClassFunction) {
   let mrGlobal = "mrGlobal: version 2.";
   firstClassFunction
   console.log(mrGlobal)                    //First console.log
}
main(drSideEffect());
console.log(mrGlobal)                      //Second console.log

在第一个consol.log的情况下,输出为: mrGlobal版本2.
在第二个consol.log的情况下,输出是: mrGlobal最近表现得很奇怪

我最初认为这会导致opppsite行为(第一个console.log用第二个console.log切换)所以这个输出让我感到惊讶。我假设这是因为javascript中的函数绑定到声明它们的作用域而不是执行它们的作用域 - 即使它们作为一等公民传递到该作用域中?

1 个答案:

答案 0 :(得分:0)

首先,测试存在轻微问题:您没有将函数drSideEffect传递给main;你调用它,然后传递它的返回值(没有)。 firstClassFunctionundefined,而firstClassFunction在一行上本身就是无操作。而是在main

中调用它
firstClassFunction();

并传递函数而不调用它:

main(drSideEffect);

结果将是相同的,因为你是对的:函数继承了它们被定义的范围,而不是它们被调用的位置。