这是变量定义还是声明?为什么?
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有两个非值:null
和undefined
。因此var x
将是值为undefined
的定义。
答案 0 :(得分:13)
var x
是一个声明,因为您没有定义它拥有的值但您声明它的存在和需要用于内存分配。
var x = 1
既是声明也是定义,但在{strong}定义的定义时,x
分隔为声明(变量赋值内联发生)。
我看到你已经理解了hoisting
的概念,但是对于那些没有的概念,Javascript接受每个变量和函数声明并将它带到顶部(相应的范围)然后逐步向下分配它们顺序。
你似乎已经知道了大部分内容。如果您想要一些高级,深入的探索,这是一个很好的资源。但我感觉你以前去过那里。
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
。
只是一个补充说明
const a;
将在需要初始化程序(定义)的地方抛出SyntaxError
。 const
是唯一需要手动声明和定义的时间。
答案 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”。这与变量值或存储无关。