标识符和变量的区别(JavaScript)

Difference between identifier and variable (in JavaScript)

我一直在寻找这个 query 的答案。

使用以下 JavaScript 语法:

var var1 = 1;
var var2 = function(a, b){
         return a + b;
      };
var var3 = var2(3, 5);

我想知道var1/var2/var3是变量还是标识符
与 JavaScript.

中的 var 关键字有点混淆

标识符和变量之间的区别就像名字和人之间的区别一样。

名字可以识别人。例如,他们还可以识别狗。名字不是人,也不是人名。但是你可以说我是 Amadan(因为说我的名字 Amadan 听起来很笨拙)。

同理:

标识符标识变量。例如,它们还可以识别标签。标识符不是变量,变量标识符也不是。但是您可以说该变量是 var2(因为说这是由标识符 var2 标识的变量听起来很笨拙)。

I would like to know, whether var1/var2/var3 are variables or identifiers.

Amadan 是一个人还是一个名字?我想,两者都是,这取决于你对它的看法有多严格。对于变量和标识符,答案又是完全平行的。

编辑:

Can I say, Name and Value, in general?

准确地说,"value"是第三个概念,变量的"contents"是相关的第四个概念。

也许对变量更好的类比是储物柜:它们有标识符(写在盒子上的数字)和内容(无论你放在里面什么)。变量不一定是值的内存位置,因为变量可以包含引用,而不是对象本身(有点像将一块房地产的地址放入储物柜,而不是试图塞满一个整个房子都放进盒子里)。所以,在这个延伸的例子中,房子就是价值;储物柜是变量;储物柜上写的#284是标识符;而带有“102 Nowhere Lane, Nowhereville”的那张纸是对值的引用,也是变量的内容。如果该值足够小且足够简单(在编程术语中,"primitive"),您可以将值本身填充到变量中,而不是引用。

例如:

var a = 1;         // assign a value
var b = [2, 3, 4]; // assign a reference
var aa = a;        // copy the contents
var bb = b;        // copy the contents

声明了四个变量(abaabb)和四个标识符来命名它们(还有abaabb);它还提到了许多值(1234、数组 [2, 3, 4])。 aaa 各自包含原始值 1 的不同副本。 b 包含对值 [2, 3, 4] 引用 (不是值 [2, 3, 4] 本身!),而后者又包含值 234bb 包含...参考的另一个副本!因此,如果您更改 b 中包含的值,bb 中的值也会自动更改:

b.push(5);
console.log(b);
// => [2, 3, 4, 5]
console.log(bb);
// => [2, 3, 4, 5]

函数也是值。

function hello(name) {
  console.log("Hello, " + name);
}

相同(几乎但不是 100%)
var hello = function(name) {
  console.log("Hello, " + name);
}

定义了一个标识符为hello的变量,其内容是对函数的引用。函数本身就是一个值。

var1var2var3 是标识符,其中 1function()callToFunction 是实际值变量。变量的值可能不同,但其标识符始终相同。

以下内容基于 Amadan 于 2015 年 1 月 28 日发表的 'Whosebug' post,并受到其启发;为了我的个人利益和澄清,我重新编写了它,然后想分享它,以防它可能对其他人在试图理解这个主题时有所帮助。

标识符和变量之间的区别等同于名称和人之间的区别。

名字可以识别人,也可以识别狗、马、宠物等。名字不是人,也不是人名。一般来说,说“我是Amadan”比说“我和Amadan这个名字有关联”更容易,后者虽然意思更简洁,但在对话中效率较低。

因此,Amadan 是一个人还是一个名字?好吧,这取决于您查看问题的上下文。因此它也适用于变量和标识符。

同理:- 标识符可以与变量相关联;它们还可以与标签、函数、过程、程序、应用程序、类、方法等相关联。标识符不是变量,变量不是标识符。因此,可以说某个任意变量是 'var2',这避免了稍微 'clunky' 的说法“我将使用一个变量并将其与标识符 'var2' 相关联”。

所以现在,问题可能会出现“我可以改为通常使用名称和值这两个术语吗?”。对我来说,不!,通常不是因为,准确地说,“值”引入了第三个概念,顺便说一句,变量的“内容”引入了相关的第四个概念。

也许变量的一个很好的类比是考虑一个储物柜:它们都有标识符(一些 number/name/colour/icon)和内容(无论那里放什么)。

变量不一定是一个值的内存位置,它可以是一个对象引用的内存位置,而不包含对象本身(这有点像把一个真实的地址将不动产放入储物柜,而不是试图将那块不动产放入储物柜。

所以,总结这个类比,储物柜就是变量;标识符是储物柜的 number/name/colour/icon;内容是一张纸,上面有地址;参考是该房地产的地址;价值是一块不动产。

因此,如果一个值足够小且足够简单(在编程术语中是“原始”),则可以将值本身直接分配给变量,而不是将引用分配给该值。

例如:-

var a = 1; // assigns a value
var b = [2, 3, 4]; // assigns a reference
var aa = a; // copy the contents of 'a' to 'aa'
var bb = b; // copy the contents of 'b' to 'bb'

上面声明了四个变量和'allocates'四个标识符(a, b, aa, bb);
它还指定了许多值(1、2、3、4,数组 []);
a 和 aa 各自包含原始值 1 的不同副本;
b 包含对某些值的引用 [2]、[3]、[4],对于此示例,这些值又恰好包含值 2、3、4;
bb 包含 aa 持有的引用的副本。

因此,如果 b 中包含的值发生变化,bb 中的值也会自动发生变化:-

b.push(5);
console.log(b);  
// console shows [2, 3, 4, 5]  
console.log(bb);  
// console shows [2, 3, 4, 5] 

函数也是值:-

function greeting(name) {  
  console.log("Hello, " + name);  
}

以上函数使用标识符'greeting',
它(几乎但不是 100%)等同于:-

var greeting = function(name) {  
  console.log("Hello, " + name);  
}

以上变量,与标识符相关'greeting'
'assigned' 有函数;
两个代码块的内容都引用了一个函数 - console.log();
每个函数本身就是一个值。