javascript作用域引用变量

javascript作用域引用变量,javascript,variables,scope,reference,Javascript,Variables,Scope,Reference,因此,我在js访谈中提出的一个问题基本上涉及内部函数中的范围和变量,例如,假设您有: function(){ var a=b=3; } 显然,b没有定义,所以它已经成为一个全局变量,现在当你在全局范围内更改b时会发生什么,a的值也会更改吗 我不知道如何测试这个,但举例来说,如果你把b改为10,a现在是10还是仍然是3 显然,b没有定义,因此它已成为一个全局变量 仅在松散模式下。不要使用松散模式。:-)使用严格模式,在这种模式下,错误总是应该出现的 现在,当您在全局范围内更改b时会发生什么情况,

因此,我在js访谈中提出的一个问题基本上涉及内部函数中的范围和变量,例如,假设您有:

function(){
var a=b=3;
}
显然,b没有定义,所以它已经成为一个全局变量,现在当你在全局范围内更改b时会发生什么,a的值也会更改吗

我不知道如何测试这个,但举例来说,如果你把b改为10,a现在是10还是仍然是3

显然,
b
没有定义,因此它已成为一个全局变量

仅在松散模式下。不要使用松散模式。:-)使用严格模式,在这种模式下,错误总是应该出现的

现在,当您在全局范围内更改
b
时会发生什么情况,
a
的值也会更改吗

不,在
a
b
之间根本没有链接。变量包含值(下面将对此进行详细说明)。执行
a=b
时,
b
中的值将复制到
a
。这两个变量之间没有创建链接

面试官可能会问一个骗人的问题(他们确实很喜欢这样做),并且/或者他/她可能会犯一个常见的错误,所以请继续阅读…:-)

我不知道如何测试这个

由于我们处于松散模式,我们知道原始函数调用将设置
this
,以在调用期间引用全局对象。由于隐式
b
global将是全局对象的一个属性,我们可以通过更改
this.b
(全局)来检查它:

函数foo(){
变量a=b=3;
console.log(“(之前)a为“+a+”,b为“+b”);
这个b=10;
console.log(“(在)a之后是“+a+”,b之后是“+b”);
}
foo()
显然,
b
没有定义,因此它已成为一个全局变量

仅在松散模式下。不要使用松散模式。:-)使用严格模式,在这种模式下,错误总是应该出现的

现在,当您在全局范围内更改
b
时会发生什么情况,
a
的值也会更改吗

不,在
a
b
之间根本没有链接。变量包含值(下面将对此进行详细说明)。执行
a=b
时,
b
中的值将复制到
a
。这两个变量之间没有创建链接

面试官可能会问一个骗人的问题(他们确实很喜欢这样做),并且/或者他/她可能会犯一个常见的错误,所以请继续阅读…:-)

我不知道如何测试这个

由于我们处于松散模式,我们知道原始函数调用将设置
this
,以在调用期间引用全局对象。由于隐式
b
global将是全局对象的一个属性,我们可以通过更改
this.b
(全局)来检查它:

函数foo(){
变量a=b=3;
console.log(“(之前)a为“+a+”,b为“+b”);
这个b=10;
console.log(“(在)a之后是“+a+”,b之后是“+b”);
}

foo()在本例中,因为3是一种基本类型的数字。因此,它对
b
赋值和
a
赋值使用原始数据类型。JavaScript中的原语值定义不可变的值。这意味着它所拥有的价值不会从你的脚下以任何方式改变

不过,这个问题有点误导。如果每次调用函数时
b
都在更改,
a
的值将不同。但每次它都是不同的变量
a
,而不是相同的变量<代码>a
立即超出范围,那么谁会关心
a
?该函数相当于在旁注上主体为
b=3
的函数,修改函数中任何类型的全局状态都是糟糕的设计

ECMAScript 6定义了七种数据类型(布尔型、空型、未定义型、数字型、字符串型、符号型、对象型),除对象外,所有数据类型均为基本数据类型

最好在采访中明确提到,您了解,如果
a
没有立即超出范围,那么对象的情况会有所不同。在这种情况下,更改
b
上的属性也会反映在
a
中。但是完全改变
b
不会对
a
产生影响。为什么?因为当你改变一个属性时,你改变的是可变值,而不是变量。您可以进一步解释,使用包装器对象编号的工作方式也不同

如果你提到他提供的代码在严格模式下无效,你也会得到额外的分数。您可以使用
“use strict”指示您正在使用严格模式
位于文件顶部,或者您也可以仅通过使严格模式成为函数中的第一条语句,将严格模式的作用域设置为函数中的严格模式。在ES6模块系统中,默认情况下启用严格模式


另一方面,由于
a
马上就超出了范围,所以这个问题非常糟糕,可能表明面试你的程序员很糟糕。在我所知道的每一个JavaScript实现中,它都不是一个多线程环境…

在本例中,因为3是数字的基本类型。因此,它对
b
赋值和
a
赋值使用原始数据类型。JavaScript中的原语值定义不可变的值。这意味着它所拥有的价值不会从你的脚下以任何方式改变

不过,这个问题有点误导。如果每次调用函数时
b
都在更改,
a
的值将不同。但每次它都是不同的变量
a
,而不是相同的变量<代码>a
立即超出范围,那么谁会关心
a
?该函数相当于在旁注上主体为
b=3
的函数,修改函数中任何类型的全局状态都是糟糕的设计

ECMAScript 6定义了七种数据类型(布尔、空、未定义、数字、字符串、符号、对象),其中