js中定义变量问题,请问定义变量时有var关键字和没有var关键字有啥差别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中定义变量问题,请问定义变量时有var关键字和没有var关键字有啥差别?相关的知识,希望对你有一定的参考价值。
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定义,就会报错。 参考技术A avascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的。可以正常运行的代码并不代表是合适的代码。
JS中变量申明分显式申明和隐式申明。
Var i=100 显示申明
i=100 隐式申明
在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。
当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量。
var num = 1是在当前域中声明变量. 如果在方法中声明,则为局部变量;如果是在全局域中声明,则为全局变量。
而num = 1,事实上是对属性赋值操作。 参考技术B
在方法外面没什么区别,在方法里面的话没有就是默认全局变量,有就是作用域只在这个方法内
比如
<script>var a=1;
b=2;
function a()
c=3;
var d=4;
alert(a);
alert(b);
alert(c);
alert(d);//这个就会报错,因为它不是全局变量
</script>本回答被提问者采纳 参考技术C 有的话应用于作用域
没有的话默认为全局变量
ts和js中let和var定义变量的区别
javascript 严格模式
第一次接触let关键字,有一个要非常非常要注意的概念就是”JavaScript 严格模式”,比如下述的代码运行就会报错:
let hello = ‘hello world.‘; console.log(hello);
错误信息如下:
let hello = ‘hello world.‘; ^^^ SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode ...
解决方法就是,在文件头添加”javascript 严格模式”声明:
‘use strict‘; let hello = ‘hello world.‘; console.log(hello);
更多更详细的关于”javascript 严格模式”说明,请参考阮一峰的博客
《Javascript 严格模式详解》
let和var关键字的异同
声明后未赋值,表现相同
‘use strict‘; (function() { var varTest; let letTest; console.log(varTest); //输出undefined console.log(letTest); //输出undefined }());
使用未声明的变量,表现不同:
(function() { console.log(varTest); //输出undefined(注意要注释掉下面一行才能运行) console.log(letTest); //直接报错:ReferenceError: letTest is not defined var varTest = ‘test var OK.‘; let letTest = ‘test let OK.‘; }());
重复声明同一个变量时,表现不同:
‘use strict‘; (function() { var varTest = ‘test var OK.‘; let letTest = ‘test let OK.‘; var varTest = ‘varTest changed.‘; let letTest = ‘letTest changed.‘; //直接报错:SyntaxError: Identifier ‘letTest‘ has already been declared console.log(varTest); //输出varTest changed.(注意要注释掉上面letTest变量的重复声明才能运行) console.log(letTest); }());
变量作用范围,表现不同
‘use strict‘; (function() { var varTest = ‘test var OK.‘; let letTest = ‘test let OK.‘; { var varTest = ‘varTest changed.‘; let letTest = ‘letTest changed.‘; } console.log(varTest); //输出"varTest changed.",内部"{}"中声明的varTest变量覆盖外部的letTest声明 console.log(letTest); //输出"test let OK.",内部"{}"中声明的letTest和外部的letTest不是同一个变量 }());
Egret下:
使用未定义的let:
class Test { public name:string = "Test"; public run(){ console.log(a); //该行报错 Block-scoped variable ‘a‘ used before its declaration. console.log(b); let a; var b; } }
重复定义let:
class Test { public name:string = "Test"; public run(){ let a; //该行报错 Cannot redeclare block-scoped variable ‘a‘. var b; let a; var b; //该行报错 Cannot redeclare block-scoped variable ‘a‘.
} }
变量范围:
class Test { public name:string = "Test"; public run(){ let a = 1; var b = 2; { let a = 2; var b = 2; } console.log(a); //1 console.log(b); //2 } }
以上是关于js中定义变量问题,请问定义变量时有var关键字和没有var关键字有啥差别?的主要内容,如果未能解决你的问题,请参考以下文章