JavaScript解释器如何解释代码?

时间:2015-07-26 15:07:21

标签: javascript syntax interpreter

我试图理解浏览器如何解释javaScript。我有以下代码

var fName = "John";
var lName = "Snow";

function myName (fName, lName) {

  fName = "Sam";
  lName = "Doe";

  return fName + ' ' + lName;

}

fName;
lName;
myName();

问题

1)当代码被解释时,引擎首先首先从上到下为变量分配内存,然后分配值,或者在同一时间内逐行完成两个操作?

2)在函数myName中,当声明fNamelName时,它们被创建为局部范围变量,如果是,为什么不允许在{{()中使用var关键字1}}。

3)如果有人能解释如何从上到下解释这段代码,我真的很感激。

3 个答案:

答案 0 :(得分:4)

  

1)当代码被解释时,引擎首先分配内存   首先从顶部到底部的变量,然后分配值   然后或同时两个操作都是逐行完成的?

解析代码时,会创建定义的全局标识符(fNamelNamemyName)。该函数被赋值并分配给其标识符,但变量尚未赋值。

变量和赋值的创建是分开的。代码中定义的所有变量都存在于代码开始之前。您可以为代码中进一步定义的变量赋值(但这很容易让人感到困惑)。例如:

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范围内包含两个变量,基本上是全局变量。成为fNamelName

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的调用堆栈/事件循环/回调队列如何相互影响