JavaScript中变量声明有var和没var的区别
成功志
JavaScript中变量声明有var和没var的区别
2015-4-8 ok12
本文来论述JavaScript中变量声明有var和没var的区别,关于Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是



(function(){ 

// ... 

})(); 



在函数内部,有var和没var声明的变量是不一样的。有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口东东。 

在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通过ECMAScrpit5提供的属性的特性查询方法,来发现之间的区别。



var fff = 2; 

window.ffa = 3; 

ffb = 4; 

this.ffc = 4; 

var ffftx = Object.getOwnPropertyDescriptor(window, 'fff'); //configurable:false,enumerable:true,value:2,writable:true 

var ffatx = Object.getOwnPropertyDescriptor(window, 'ffa'); //configurable:true,enumerable:true,value:2,writable:true 

var ffbtx = Object.getOwnPropertyDescriptor(window, 'ffb'); //configurable:true,enumerable:true,value:2,writable:true 

var ffctx = Object.getOwnPropertyDescriptor(window, 'ffc'); //configurable:true,enumerable:true,value:2,writable:true



通过上面,发现,原来还是有差别的,我们再用delete删除属性来验证下,配置性为false的属性无法删除。也就是通过变量var声明全局对象的属性无法删除,我们还会发现和函数声明创建的全局对象属性也无法删除。



delete fff; // 无法删除 

delete ffa; // 可删除 

delete ffb; // 可删除 

delete ffc; // 可删除



结论就是,加上var 和没加 var的声明全局变量是有区别的。 

使用var语句重复声明语句是合法且无害的。如果重复声明且带有赋值,那么就和一般的赋值语句没差别。如果尝试读取没有声明过的变量,Js会报错。 

JavaScript的函数作用域内,声明的变量或内部函数,在函数体内都是可见的。意味着,函数在定义之前可能已经可用。函数定义有两种方式,一种是函数定义表达式,一种是函数声明语句。



// 函数定义表达式 

var fns = function (){ 

// ... 

}; 

// 函数声明语句 

function fns(){ 

// ... 

}



函数声明语句“被提前”到外部脚本或外部函数作用域的顶部,所以以这种方式声明的函数,可以被再它定义之前出现的代码所调用。而函数定义表达式中,变量的声明被提前了,但是给变量的赋值是不会提前的,所以,以表达式方式定义的函数在函数定义之前无法调用。



(function() { 

testa(); // 打印出testa 

testb(); // 报错:提示undefined is not a function 

console.log(testc); //打印出testc 

function testa() { 

console.log("testa"); 



var testb = function() { 

console.log("tesb"); 



var testc = "testc"; 

})();




当然,我们声明变量和函数,必须遵守基本的规范,变量和函数声明要提前。



来源:http://www.veryhuo.com/a/view/65098.html







======krew 464 2014年07月17日 回答=============================








1.在函数作用域内 加var定义的变量是局部变量,不加var定义的就成了全局变量。

使用var定义


var a = 'hello World'; function bb(){ var a = 'hello Bill'; console.log(a);   
}
bb() // 'hello Bill' console.log(a); // 'hello world'


不使用var定义


var e = 'hello world'; function cc(){
e = 'hello Bill'; console.log(e); // 'hello Bill' }
cc() // 'hello Bill' console.log(e) // 'hello Bill'


2.在全局作用域下,使用var定义的变量不可以delete,没有var 定义的变量可以delete.也就说明隐含全局变量严格来说不是真正的变量,而是全局对象的属性,因为属性可以通过delete删除,而变量不可以。



3.使用var 定义变量还会提升变量声明,即

使用var定义:


function hh(){ console.log(a); var a = 'hello world';
}
hh() //undefined


不使用var定义:


function hh(){ console.log(a);
a = 'hello world';
}
hh() // 'a is not defined'


这就是使用var定义的变量的声明提前。



4.在ES5'use strict'模式下,如果变量没有使用var定义,就会报错


发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容