Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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,考虑以下代码段: function myFunction(a){ console.log(a); } myFunction(1); //1 var oldFunction = myFunction; function myFunction(b){ console.log('intercept'); oldFunction(b); } myFunction(1); //too many calls, console outputs intercept indefini

考虑以下代码段:

function myFunction(a){
    console.log(a);
}

myFunction(1);
//1

var oldFunction = myFunction;

function myFunction(b){
    console.log('intercept');
    oldFunction(b);
}
myFunction(1);
//too many calls, console outputs intercept indefinitely 
代码无法正常工作,并无限期地输出“截获”。然后我搜索了Stack Overflow,发现下面的修改工作正常:

function myFunction(a){
     console.log(a);
}

myFunction(1);//1

var oldFunction = myFunction;

var myFunction = function(b){
    console.log('intercept');
    oldFunction(b);
}
myFunction(1);
//intercept 
//1
我的问题是:为什么第一个代码不能按预期工作?我知道函数声明和函数表达式之间存在差异(主要是由于提升行为),但我仍然感到困惑

编辑:确实是起重行为被误解了。我意识到,如果我按照以下方式执行第一个代码,那么它就可以工作:

eval(`function myFunction(a){
    console.log(a);
}

myFunction(1);
//1

var oldFunction = myFunction;`);

eval(`function myFunction(b){
    console.log('intercept');
    oldFunction(b);
}
myFunction(1);`);
//1
//intercept
//1

这就结束了问题。当我单独执行代码时,很明显函数myFunction正在提升。

这是因为提升。在JavaScript中,这意味着它们被“提升”到顶部并首先声明,并且可以在定义它们之前使用:

foo()//日志“在foo中”
函数foo(){
console.log(“in-foo”);

}
在第一个示例中,
旧函数
定义为

function myFunction(b){
    console.log('intercept');
    oldFunction(b); // calls `oldFunction` again
}
function myFunction(a){
     console.log(a);
}
在第二个示例中,
oldFunction
定义为

function myFunction(b){
    console.log('intercept');
    oldFunction(b); // calls `oldFunction` again
}
function myFunction(a){
     console.log(a);
}
只有这一部分起作用:

function myFunction(a){
    console.log(a);
}

myFunction(1);
//1
只要你把剩下的加起来

function myFunction(a){
    console.log(a);
}

myFunction(1);
//1

var oldFunction = myFunction;

function myFunction(b){
    console.log('intercept');
    oldFunction(b);
}
myFunction(1);
//too many calls, console outputs intercept indefinitely 
它将失败,因为对于JS引擎来说,它是这样的:(按照正确的顺序)

由于吊装,在您的代码中,此函数

function myFunction(a){
    console.log(a);
}
完全消除,并立即替换为

function myFunction(b){
    console.log('intercept');
    oldFunction(b);
}

甚至在代码中执行一个表达式之前。像第一个代码中的
var oldFunction=myFunction

之类的东西sniplet myFunction被new myFunction覆盖,oldFunction引用相同的函数,因此代码以递归顺序执行。但在第二个代码中,第二个myFunction声明为annomous函数,它不重写旧的myFunction,当调用旧的myFunction时,它只指向第一个myFunction

可能重复的