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关键字有啥差别?的主要内容,如果未能解决你的问题,请参考以下文章

请问js里的变量值怎样传入后台?

var关键字

js中let和var定义变量的区别

var 关键字

ts和js中let和var定义变量的区别

js变量提升