Javascript 如何在js解释器中使用var或let声明函数

Javascript 如何在js解释器中使用var或let声明函数,javascript,function,Javascript,Function,我有两个函数,它们是函数声明 function myFunction(){ console.log("3"); } myFunction(); // prints "7" function myFunction(){ console.log("7"); }; myFunction(); // prints "7" 当我用var关键字生成两个函数表达式时,我发现结果有污点 var myFunction = function(){ console.log("3"); } my

我有两个函数,它们是函数声明

function myFunction(){ 
   console.log("3");
}
myFunction(); // prints "7"

function myFunction(){
 console.log("7");
};
myFunction(); // prints "7"
当我用var关键字生成两个函数表达式时,我发现结果有污点

var myFunction = function(){ 
  console.log("3");
}  
myFunction(); // prints "3"

var myFunction = function(){
  console.log("7");
};
myFunction(); // prints "7"
在我读到的一些关于提升的文章中,有人说js函数声明被提升了,它们将位于代码顶部。js函数使一个对象的名称与函数的名称相同。我发现,如果有两个同名变量make和var关键字,它们会相互覆盖。好的,现在我试试这个

let myFunction = function(){ 
 console.log("Old");
}
myFunction(); //Error:myFunction already declared

let myFunction = function(){
 console.log("New");
};
myFunction();

因此,我的问题是,在interputer中运行时存在函数声明,interputer将object作为函数名,它使用var或let创建它。问题实际上不是提升,而是重新声明let值。你不能做的是:

let myFunction  = function () {};
let myFunction  = function () {}; // Uncaught SyntaxError: Identifier 'myFunction' has already been declared

因此,第四行执行函数时没有错误,但第六行重新定义函数时没有错误。

我将尝试解释您提到的三种方法之间的差异

功能关键字

通过function关键字声明函数是挂起的,因此当您声明两个同名函数时,它只返回第二个函数的结果,因为函数声明移动到代码的顶部(在调用之前)

所以你写的代码是

function myFunction(){ 
  console.log("3");
}
myFunction(); // prints "7"

function myFunction(){
 console.log("7");
};
myFunction(); // prints "7"
在运行时变成这样:

function myFunction(){ 
  console.log("3");
}
function myFunction(){
 console.log("7");
};

//functions declarations become first 


myFunction(); // prints "7"


myFunction(); // prints "7"
var关键字

在运行时,使用
var
关键字声明的任何变量都会在值未定义的情况下移动到代码的顶部,然后在解释器到达这一行代码时分配给它的值,因此我们在开始时有两个未定义值的变量,我们分配第一个函数并调用它(打印3)然后我们用新值覆盖它并再次调用它(打印7)

let关键字


let是块作用域变量,不能用同一个块声明两次,因此它不起作用

“defarent”、“interputer”?我知道interputer如何用var或let关键字调用函数声明。它是用let why in调用的,不能抛出一个错误这两者都可能重复。当我们的函数代码在interputer上运行时,函数是用
function
keyword.no声明的。interputer首先将变量命名为它的名称,比如(var/let=myFunction);我在博客中读到我理解你的var和let部分,但没有函数关键字。我读到js中的function是object。所以我的问题是谁用var或let关键字创建这个对象;我在我的答案中添加了一个示例检查
interputer
我假设你的意思是
解释器
,具有讽刺意味的是,大多数Javascript引擎并不是真正的
解释器
现在,更多的是基于JIT的。无论如何,我能理解英语不是你的母语,而是这个问题
是谁用var或let关键字创建了这个对象,这让人非常困惑,我不认为只有我一个人在努力理解你的要求,你能试着重新措辞,我们从那里开始吗。?ps,我在顶部的评论中给出了你的结果不同的原因,你在这一部分有困难吗?@Keith善意地将你的评论添加到原始帖子中,不是在回答中,谢谢,但是MDN如何说函数是一个对象。你的例子说它仍然是函数。