IF 一个函数被赋值给一个使用 var 声明的变量和 let 有啥区别?

Posted

技术标签:

【中文标题】IF 一个函数被赋值给一个使用 var 声明的变量和 let 有啥区别?【英文标题】:IF a function is assigned to a variable declared using var and let what is the difference?IF 一个函数被赋值给一个使用 var 声明的变量和 let 有什么区别? 【发布时间】:2018-12-03 22:47:05 【问题描述】:

当我运行下面的代码时,它给了我错误

var name = function print()
console.log("welcome ......");
;
name();


js.js:5 Uncaught TypeError: name is not a function
at js.js:5

但是当我将 var 关键字更改为 let 时,它运行良好 谁能解释一下

let name = function print()
console.log("welcome ......");
;
name();

【问题讨论】:

【参考方案1】:

namejavascript 运行时中的预定义属性,setget 是窗口的名称。因此,在使用var 时,不能将此保留属性用作函数。

这样做的原因是let 允许您声明范围受限于使用它的块、语句或表达式的变量。这与 var 关键字不同,后者在全局范围内定义变量,或者在本地定义整个函数,而不管块范围如何。因此,当var 尝试将name 定义为变量时,在这种情况下为globally,它与现有的name 属性冲突,因此您在使用var 时会出现该错误,但不会与let 一起使用。

//get name  value
console.log(name);
//set name value
name = 'someNewName';
console.log(name);

因此,要使代码运行,您需要将函数名称更改为其他名称,例如name1

var name1 = function print()
  console.log("welcome ......");

name1();

【讨论】:

@JamilAmini 很高兴为您提供帮助 @giorgim 在回答中添加了更多细节 @AnkitAgarwal 是有道理的,但是如果我直接在脚本中使用 let 声明变量,例如不把它封装在函数中,那它不也是全局的吗? @giorgim 它的范围仅限于块,这意味着仅适用于该特定的 JS 文件,而不是整个 JavaScript 环境 @AnkitAgarwal Ah 和var 意味着它不仅是那个文件(如果它在函数或块之外),而是整个JS环境,好的,明白了。

以上是关于IF 一个函数被赋值给一个使用 var 声明的变量和 let 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中var let const三种变量声明方式

js中的函数提升和变量提升

一道关于js声明变量,var和let的面试题

JavaScript 变量声明

怎样理解在函数中声明var x = y = 1后调用函数时, x是局部变量, y是全局变量

js匿名函数