我有一个全局变量x,它与内部函数的名称相同 当我执行测试函数时,它还执行与全局变量相同的函数,该函数包含为与函数名称相同的变量赋值,现在在下一行中它会提醒值对于x,它会发出警报2,但是当执行测试功能后,如果你警告x,它仍会警告10 ... y?
eg
var x =10; //assigns value 10 to global variable x
function test(){
function x () {
x = 2; //assigns value x
alert(x); // x =2
}
x(); //calls x
}
test(); //call function test
但是如果你警告x,那么它会给出10 ... 为什么这样;
如果你喜欢这个
var y =10; //assign value 10 to y
function test(){
function x () {
y = 2; //assign value 2 to y
alert(y); //alerts y is 2
}
x(); //call the function x
}
test(); //call the test function
如果你检查y那么它也是2 .. 这两者有什么区别..我知道第二个的行为.. 但不知道第一个......
答案 0 :(得分:1)
函数声明有两件事:
var x
相同。x = function x () { ... }
相同,除非它被悬挂。在第一个示例中,x
的函数声明在x
范围内创建变量test
,因此当您x = 2;
时,您正在用x
覆盖2
中指向函数的指针,同时保留另一个变量x
(它存在于更宽的范围内并保存变量{{ 1}}单独)。
这可以证明:
10
在第二个示例中,该函数名为var x = 10;
function test() {
function x() {
x = 2; //assigns value x
}
alert("x inside test before calling x(): " + x)
x(); //calls x
alert("x inside test after calling x(): " + x)
}
alert("x outside test before calling test(): " + x)
test()
alert("x outside test after calling test(): " + x)
,因此它不会在较窄的范围内创建新的y
,而x
会触及原始x = 2
。
答案 1 :(得分:0)
function
关键字类似于var
- 它们都将它们定义的名称变为局部变量。所以有两个x
变量:一个是范围在test
函数之外,另一个是范围在函数内部。分配到内部x
不会影响外部x
。
在您的第二个版本中,您在函数内部没有var
或function
y
声明,因此它会访问全局变量。
有关详细信息,请参阅