什么';JavaScript中变量定义和声明的区别是什么?

什么';JavaScript中变量定义和声明的区别是什么?,javascript,Javascript,这是变量定义还是声明?为什么 varx ..在该语句之后是否为x保留了内存 编辑: 在C外部intx是一个声明,intx=5是一个定义。JS中的模拟是什么?维基百科说,一个声明分配内存,这个定义为分配的内存分配一个值 第二次编辑: 我认为@Deryck的解释听起来不错,但有一些输出与他的解释不一致: > var x; undefined > x undefined // now it looks like x is defined to the value undefined >

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

varx

..在该语句之后是否为x保留了内存

编辑: 在C外部
intx
是一个声明,
intx=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未声明
,这是有意义的。但我经常读到JS有两个非值:
null
undefined
。因此,
var x
将是一个值为
undefined
的定义

var x, y, z;

var x;

var h = 4;

i = 4;
如果位于顶部,则上述所有变量都是全局变量(在任何函数之外)

假设javascript有一个函数start

function start() {
      x = 5*5;
}
全局变量x现在等于25


其中,假设var x;未放置在任何函数之外,该变量x将只是该函数的局部变量。

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

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

要为变量赋值,请使用等号
var carname=“沃尔沃”

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

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

无功提升

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

 bla = 2
 var bla;
  // ...

  // is implicitly understood as:

 var bla;
 bla = 2;
因此,建议始终在函数顶部声明变量。否则,可能会导致混淆情况


在声明变量而不为其赋值时,仍然需要一些可用内存,否则您无法在程序中稍后引用该变量。我不认为这是一个值得注意的内存使用量,也不会产生任何影响。

声明一个变量就像告诉(javascript)编译器这个标记
x
是我想在以后使用的东西。它确实指向内存中的一个位置,但它还不包含值。即,它是
未定义的

var x;
> var x;
undefined
> x
undefined // now it looks like x is defined to the value undefined
> y
ReferenceError: y is not defined
定义它意味着给它一个值,你可以这样做:

x = 10; // defining a variable that was declared previously
或者像这样:

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

var x
是一个声明,因为您没有定义它持有的值,而是声明它的存在和内存分配的需要

var x=1
既是声明又是定义,但在开始时用
x
声明分隔,而其定义位于指定行(变量赋值发生内联)

我知道你已经理解了提升的概念,但是对于那些不理解的人来说,Javascript会把每个变量和函数声明都带到顶部(对应的范围),然后依次分配它们

不过,你似乎已经知道了其中的大部分。如果你想进行一些高级、深入的探索,这里有一个很好的资源。但我觉得你以前去过那里


PS—您对C变量dec/def和JS的类比非常准确。你在维基百科上读到的是正确的。

为了更好的解释,我会给你一个很长的答案

当javascript引擎无法在内存中找到特定变量时,它将抛出一个错误。更具体地说,当javascript引擎(执行上下文)无法“引用”内存中的变量时,它将抛出一个
引用错误
。这与声明错误不完全相同,至少在javascript中是这样

未定义
错误与值
未定义
之间存在差异

这样做

var a = undefined;

两者都将记录相同的结果,即
未定义
。这是因为,当你简单地做一个
var ajavascript引擎为变量分配内存,并自动将其值设置为
未定义的
,这不同于说
a
根本不存在-在这种情况下,它将抛出一个
引用错误

吊起 将记录
未定义的
,因为javascript引擎知道在代码中的某个地方有一个变量已声明——这意味着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;
将在需要初始值设定项(定义)的位置抛出一个
SyntaxError
<代码>常量
是唯一需要手动声明和定义的时间

var x;
这是一个变量声明。在Js中,若在声明中并没有为变量赋值。默认情况下,它将获得未定义的

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;
};
我已经从一个
myObject.prototype.myFunction = function () {
    return this.myField;
};
> var x;
undefined
> x
undefined // now it looks like x is defined to the value undefined
> y
ReferenceError: y is not defined