JavaScript中变量声明有var和没var的区别示例介绍
作者:bea
本文来论述JavaScript中变量声明有var和没var的区别,关于Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (function(){ // ... })(); 在函数内部,有var和没var声明的变量是不一样的。有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口东东。 在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通
本文来论述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); //undefined,如果移到上面就可以了
function testa() {
console.log("testa");
}
var testb = function() {
console.log("tesb");
}
var testc = "testc";
})();
当然,我们声明变量和函数,必须遵守基本的规范,变量和函数声明要提前。
有用 | 无用
(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); //undefined,如果移到上面就可以了
function testa() {
console.log("testa");
}
var testb = function() {
console.log("tesb");
}
var testc = "testc";
})();
当然,我们声明变量和函数,必须遵守基本的规范,变量和函数声明要提前。
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- JavaScript将取代AppleScript?
- Javascript MVC框架Backbone.js详解
- JS回调函数的应用简单实例
- js实现在同一窗口浏览图片
- js实现获取焦点后光标在字符串后
- 在JavaScript中构建ArrayList示例代码
- 取得元素的左和上偏移量的方法
- JS实现OCX控件的事件响应示例
- javascript快速排序算法详解
- js生成的验证码的实现与技术分析
- Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
- nodejs命令行参数处理模块commander使用实例
- node.js中使用q.js实现api的promise化
- Javascript判断文件是否存在(客户端/服务器端)
- ie8下修改input的type属性报错的解决方法
- JavaScript函数定义的常见注意事项小结
- JavaScript的各种常见函数定义方法
- JavaScript中合并数组的N种方法
- JavaScript的null和undefined区别示例介绍