JS中的函数参数会发生什么变化?

时间:2018-01-11 15:05:22

标签: javascript ecmascript-6

鉴于代码:

from numpy import nan
df = df.replace('NAN', nan)

结果是人们所期望的:

function stuff() {
    console.log('stuffing');
}

stuff = stuff;

stuffy = () => stuff();

stuffx = () => console.log('tobi');
function stuffers(stuff = stuffx) {
    stuff();
    stuffy();
}

stuffers();

但是当像这样更改 stuffers 函数签名时:

tobi
stuffing

结果是:

function stuff() {
    console.log('stuffing');
}

stuff = stuff;

stuffy = () => stuff();

stuffx = () => console.log('tobi');
function stuffers(stuff = stuff) {
    stuff();
    stuffy();
}

stuffers();

为什么只有在同名的情况下才会发生这种情况?

1 个答案:

答案 0 :(得分:1)

您的案例中的主要问题是,您使用本地声明来全局定义全局定义的东西函数。 正如xadhix所提到的,这个声明

function stuffers(stuff = stuff) {
    stuff();
    stuffy();
}

编译为(我将其拆分为3部分以提供可读评论):

function stuffers() {
    var stuff; 

全局定义的内容在本地环境中重新声明。

    stuff = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : stuff;

这里发生了函数声明(stuff = stuff)的默认赋值,但该变量已在此范围内使用未定义的值重新初始化,因此它只是将一个未定义的值再次赋值给stuff变量(stuff = stuff)< / p>

    stuff(); //error
    stuffy();
}

这不会发生在&#34;工作&#34;例如,本地范围内不存在stuffx,而assigment stuff = stuffx不会产生未定义的值。

从stuffers透视实际执行的内容的完整片段是

function stuffers() {
    var stuff;
    stuff();
    stuffy();
}