我试图理解浏览器如何解释javaScript。我有以下代码
var fName = "John";
var lName = "Snow";
function myName (fName, lName) {
fName = "Sam";
lName = "Doe";
return fName + ' ' + lName;
}
fName;
lName;
myName();
问题
1)当代码被解释时,引擎首先首先从上到下为变量分配内存,然后分配值,或者在同一时间内逐行完成两个操作?
2)在函数myName
中,当声明fName
和lName
时,它们被创建为局部范围变量,如果是,为什么不允许在{{()
中使用var关键字1}}。
3)如果有人能解释如何从上到下解释这段代码,我真的很感激。
答案 0 :(得分:4)
1)当代码被解释时,引擎首先分配内存 首先从顶部到底部的变量,然后分配值 然后或同时两个操作都是逐行完成的?
解析代码时,会创建定义的全局标识符(fName
,lName
和myName
)。该函数被赋值并分配给其标识符,但变量尚未赋值。
变量和赋值的创建是分开的。代码中定义的所有变量都存在于代码开始之前。您可以为代码中进一步定义的变量赋值(但这很容易让人感到困惑)。例如:
fName = "John";
lName = "Snow";
var fName, lName;
2)在声明fName和lName的函数myName中它们是 创建为本地范围变量,如果是,为什么不允许使用 ()中的var关键字。
函数中定义的参数在函数中创建为局部变量。就好像参数有一个隐含的var
,因此不需要(也不允许)。
通过声明局部变量并将参数值赋给它们,可以获得基本相同的效果:
function myName() {
var fName = arguments[0];
var lName = arguments[1];
...
3)如果有人能解释这段代码,我真的很感激 从上到下解释。
执行代码时,代码从上到下运行。为全局变量赋值,跳过函数,因为它是一个定义,然后计算全局变量并忽略结果,然后调用该函数。
在函数中创建参数并为其分配值。由于您不发送任何值,因此它们的值为undefined
。在代码中为参数分配新值,然后连接并返回这些新值,但调用代码忽略函数的返回值。
答案 1 :(得分:2)
var fName = "John";
var lName = "Snow";
在window
范围内包含两个变量,基本上是全局变量。成为fName
和lName
。
function myName (fName, lName) {
fName = "Sam";
lName = "Doe";
return fName + ' ' + lName;
}
这里的变量是参数(fName, lName)
,被视为局部变量,但参数不需要由var
定义,它们与全局变量fName
和{不同{1}}。
lname
答案 2 :(得分:0)
首先,JavaScript是一种松散类型的语言,这意味着无论该语句期望使用哪种数据类型,JavaScript都会自动将数据转换为该类型。 当值初始化为各个字符串,数组,对象等时,JavaScript会分配内存。
var a = 123; //Allocates memory for number
var b = "program" //Allocates memory for string
当您创建带有参数的函数的函数时,这些参数被视为局部变量,您还可以在创建参数时初始化值。
在从上到下执行该代码段之前。首先,您应该了解口译员的工作方式。 “ 解释程序逐条语句检查程序语句的错误。检查一条语句后,它将该语句转换为机器代码,然后执行该语句。该过程一直持续到程序的最后一条语句出现为止。” 1.为两个全局变量分配的第一个内存 2.功能被跳过 3.最后调用函数并返回值 请检查此Loupe visualisation,以了解JavaScript的调用堆栈/事件循环/回调队列如何相互影响