JavaScript中的变量定义和声明之间有什么区别?

时间:2013-12-29 04:02:08

标签: javascript

这是变量定义还是声明?为什么?

var x;

..并且是在此语句之后为x保留的内存?

编辑: 在C extern int x;是一个声明,int x = 5;是一个定义。 JS中的模拟是什么?维基百科说声明分配内存,定义为这个分配的内存分配一个值。

第二次编辑: 我认为@Deryck的解释听起来不错,但是有些输出不同意他的解释:

> var x;
undefined
> x
undefined // now it looks like x is defined to the value undefined
> y
ReferenceError: y is not defined

如果ReferenceError输出会说y is not declared,那就有意义了。但我经常读到JS有两个非值:nullundefined。因此var x将是值为undefined的定义。

9 个答案:

答案 0 :(得分:13)

var x是一个声明,因为您没有定义它拥有的值但您声明它的存在和需要用于内存分配。

var x = 1既是声明也是定义,但在{strong}定义的定义时,x分隔为声明(变量赋值内联发生)。

我看到你已经理解了hoisting的概念,但是对于那些没有的概念,Javascript接受每个变量和函数声明并将它带到顶部(相应的范围)然后逐步向下分配它们顺序。

你似乎已经知道了大部分内容。如果您想要一些高级,深入的探索,这是一个很好的资源。但我感觉你以前去过那里。

Javascript Garden

PS - 你在C变量dec / def和JS之间进行类比。您在维基百科上阅读的内容是正确的。

答案 1 :(得分:9)

声明变量就像告诉(javascript)编译器这个标记 x 是我想要使用的以后。它确实指向内存中的某个位置,但它还没有包含值。即。它是undefined

var x;

定义它意味着给它一个值,你可以这样做:

x = 10; // defining a variable that was declared previously

或者像这样:

var y = 20; // declaring and defining a variable altogether.

http://msdn.microsoft.com/en-us/library/67defydd(v=vs.94).aspx http://www.w3schools.com/js/js_variables.asp

答案 2 :(得分:1)

我会为您提供详尽的答案,以提供更好的解释。

当javascript引擎无法在内存中找到特定变量时,它将引发错误。更具体地说,当JavaScript引擎( Execution Context )无法“引用”内存中的变量时,它将抛出ReferenceError。至少在javascript中,这与声明错误不完全相同。

not defined错误和值undefined之间存在差异。

这样做

var a = undefined;

var a;

将记录相同的结果,即undefined。这是因为,当您简单地执行var a;时,javascript引擎会为变量分配内存并自动将其值设置为undefined,这与说a不存在全部-在这种情况下,它将抛出ReferenceError

吊装

console.log(a);    // undefined
var a = 'something';

将记录undefined,因为javascript引擎知道代码中某处有 declared 变量-这意味着说javascript引擎在执行代码之前实际上已经做了一些事情-它所做的是提升变量。简而言之,上面的代码与

相同
var a;             // hoisted (declared and defined the value `undefined`)
console.log(a);    // undefined
a = 'something'    // update the defined value to `something`

是的,声明和定义在javascript中同时发生(自动-如果您自己不做的话),并且默认的定义值为undefined

ES6

只是一个补充说明

const a;

将在需要初始化程序(定义)的地方抛出SyntaxErrorconst是唯一需要手动声明和定义的时间。

答案 3 :(得分:0)

var x, y, z;

var x;

var h = 4;

i = 4;

以上所有都是全局变量,如果放在顶部,(在任何函数之外)

让我们说javascript有一个函数start

function start() {
      x = 5*5;
}

全局变量x现在等于25

如果var x;没有放在任何函数之外,变量x只是该函数的本地函数。

答案 4 :(得分:0)

使用var关键字声明JavaScript变量: var carname;

声明后,变量为空(没有值)。

要为变量赋值,请使用等号 var carname="Volvo";

在计算机程序中,变量通常是在没有值的情况下声明的。值可以是必须计算的值,或者稍后将提供的值,例如用户输入。声明没有值的变量将具有未定义的值。

执行以下语句后,变量carname将具有未定义的值: var carname;

var hoisting

在JavaScript中,变量可以在使用后声明。

 bla = 2
 var bla;
  // ...

  // is implicitly understood as:

 var bla;
 bla = 2;

因此,建议始终在函数顶部声明变量。否则,可能会导致令人困惑的案件

When declaring a variable without assigning a value to it, there still needs to be some memory available for it, otherwise you cannot make a reference to the variable later in the program. I don't think it's a noticeable amount of memory being used and won't make a difference.

答案 5 :(得分:0)

var x;

这是一个变量声明。在Js中,如果您没有为声明中的变量分配任何值。默认情况下它将获得undefined

var x; // declaring x
console.log(x); // output: undefined

但是,如果您还没有声明变量,请尝试访问它。它说该变量未定义。

console.log(y);  // Output: ReferenceError: y is not defined

如果需要访问JS文件之间的对象,则优良作法是将一个对象公开给全局名称空间,并在该对象上声明字段和方法。

文件1:

var myObject;
myObject.myField = "Field!";   

文件2:

myObject.prototype.myFunction = function () {
    return this.myField;
};

我摘自一个关于Equivalent of C extern declaration in JavaScript

的非常好的讨论

https://github.com/ganqqwerty/123-Essential-JavaScript-Interview-Questions

答案 6 :(得分:0)

简单来说,

未定义表示未定义变量的

未定义表示变量本身未定义。

var x; //value is not defined. So, x //undefined

//y variable is not declared or defined. So, y // y is not defined

答案 7 :(得分:0)

> var x;
undefined
> x
undefined // now it looks like x is defined to the value undefined
> y
ReferenceError: y is not defined

尽管通常会说Javascript是一种解释语言,但是在解释器运行之前,还有一个编译步骤非常快速地发生。此编译步骤的工作是创建作用域链,在该作用域链中,在它们各自的作用域中声明变量(此处没有读/写操作,只是简单的名称保持)。这些变量将指向某个内存位置,但是在解释器执行某些执行之前,其中的值将是不确定的。

> 编译器运行:

当编译器看到var x;时,它将简单地将该变量保留在其各自的范围内。

下一个x;y;由于是执行语句,因此在编译步骤中将被忽略。

> 翻译运行:

当解释器看到var x;时,由于此处没有读/写操作,它将跳过此操作。

现在,当解释器看到x;(执行语句)时,在作用域中已经声明了“ x”,并且它将保留值“ undefined”,这是您在控制台上得到的。

但是,当解释器看到y;时,在编译步骤中没有先前的声明或名称保留,因此我们按预期获得了ReferenceError。

希望有人认为此评论有用。

答案 8 :(得分:0)

关于 undefined 和 null 之间区别的各种琐事完全不谈,简短的回答是:Javascript 中没有等价物。没有光秃秃的“前向声明”。 Javascript 变量声明是定义。已定义但未显式初始化的变量将包含值“未定义”。没有“外部链接”。

如果您引用的标识符不在任何可访问范围内(可能是因为它首先不存在),您将收到“ReferenceError: y is not defined”。这与变量值或存储无关。