为什么JavaScript声明变量的时候鼓励加var关键字

在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。

[javascript] view plaincopyprint?

  1. var x = "XX";
  2. y ="xxx";
var x = "XX";
y ="xxx"; 

诸如此类。这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于“隐式”声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现。 
当你在当前上下文内进行这种“隐式”声明时,JavaScript引擎会先在当前上下文中寻找是否之前有声明此变量,如果没有,再到上一级的上下文中去寻找,如果一直未找到,会最后在window上声明这个变量! 
比如:

复制代码代码如下:

window. y = "hello"; 
function func(){ 
y = "OH, NO!!!"; 

func(); 
alert(window.y); //#=> display "OH, NO!!!"

当上下文中的任意一层有这种“隐式”定义的变量时,那么该层的该变量会被修改,而不会在window上生成一个新的变量。(这种bug也挺讨厌的,尤其是封装的比较复杂的代码) 
比如:

复制代码代码如下:

var x = "window.x"; 
function a() { 
var x = "a‘s x"; 
var b = function() { 
var c = function() { 
//no var! 
x = "c‘s x:"; 
}; 
alert("before c run,the b.x:" + x); 
c(); 
alert("after c run, the b.x:" + x); 
}; 
alert("a.x is:" + x); 
b(); 
alert("after b function runed, the a.x is:" + x); 
}; 
alert("before a run, window.x:" + x); 
a(); 
alert("after a run, window.x:" + x);

这里面有以下几层:window, func a, func b, func c一直作层级嵌套。window->a->b->c 
window和a中,都有定义变量x,b中未定义该变量,在c中‘隐式‘声明了一个x,该x最终修改了a变量的值。 
牢记,在JavaScript中,声明变量,一定前面要加var .

时间: 2024-08-09 16:22:29

为什么JavaScript声明变量的时候鼓励加var关键字的相关文章

声明变量,一定要用 var!

public static T TryGet<T>(Func<T> func, T ifError = default(T)) { try { return func(); } catch { return ifError; } } string a;try{ a = doooooooooo(); } catch { a = "wrewre"; } //this is shit! var a = TryGet(doooooooooo, "wrewre&

javascript的变量声明、数据类型

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script> /* javascript的变量声明:

声明变量

<script> /* javascript的变量声明: 格式: var 变量名 = 数据; 声明变量要注意的事项: 1. 在javascript中声明变量是 使用var关键字声明的,javascript中的变量可以存储任意的数据类型数据. 2. javascript中变量数据类型是根据存储的值决定的,可以随时更改存储数据的类型. 3. 定义了多个同名的变量是,后定义的同名变量是覆盖前面定义的同名变量. 4. 声明变量的时候可以省略var关键字,但是不建议省略. javascript的数据类型

JavaScript中变量和函数声明的提升

现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. 5.不同<script>块中的函数互不影响. 例子: 函数声明提升高于变量声明 //同时声明变量a和函数a var a; function a() {} alert(typeof a); //显示的是"function",初步证明function的优先级高于var. //先声

javascript声明对象时 带var和不带var的区别

Javascript声明变量时 var aaa = 111; 和 aaa = 111; 两种方式一样吗? 废话少说,先上代码. var aaa = 11; function test4(){ var aaa = 22; } test4(); console.log(aaa); 结果是什么呢? 11 这个好理解, 函数内的var aaa声明是内部变量,这时结果是第一个aaa的值. 变动一下如下: var abc = 11; function test4(){ abc = 22; } test4()

轻松学习JavaScript五:JavaScript的变量和数据类型

对于一们编程语言,肯定包含变量和数据类型.今天我们就来看看JavaScript脚本语言的变量和数据类型.相对 于其他的Java,C++等高级程序语言,JavaScript显得很简单. 一变量 JavaScript的变量是松散类型的,所谓松散就是用来保存任何类型的数据.变量是存储信息的容器.定义变量时 要使用var操作符(var是关键字),后面跟一个变量名(变量名是标识符).变量也就是初始化后可以再次改变的量. 那么我们来看看实例: <span style="font-size:18px;&

C# var声明变量解析

C# var声明变量解析: 在C#3.0中提供了一种新的声明变量的方式,这就是var. 通过这个关键字,在声明变量时就无需指定类型了,变量类型是在初始化时由编译器确定的.代码如下: var ss = "abcd"; MessageBox.Show(ss.GetType().ToString()); 上面的代码将显示System.String,从而证明C#编译器已经将ss编译成了String变量了. 而在输出ss后,再输入"."后,会看到将String类型变量的相应方

【声明变量的规则】

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 <script type="text/javascript"> 7 //声明变量以及命名规则 8 var a; 9 var b; 10 var c,d; 11 /*alert(a);*/ 12 //声明变量的同时并且赋值 1

ES6中6种声明变量的方法

ES5 只有两种声明变量的方法:var命令和function命令. ES6 除了添加let和const命令,还有两种声明变量的方法:import命令和class命令. 所以,ES6 一共有 6 种声明变量的方法. (1) var命令. var a ; //undefined var b = 1; var定义的变量可以修改,如果不初始化会输出undefined,不会报错 var 声明的变量在window上,用let或者const去声明变量,这个变量不会被放到window上 很多语言中都有块级作用域