javascript:相同的变量名称和函数名称

时间:2015-01-10 19:00:29

标签: javascript

我有一个全局变量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 .. 这两者有什么区别..我知道第二个的行为.. 但不知道第一个......

2 个答案:

答案 0 :(得分:1)

函数声明有两件事:

  1. 在当前范围内声明一个新变量(与该函数同名)。这与var x相同。
  2. 它创建一个函数并将其分配给该变量。这与x = function x () { ... }相同,除非它被悬挂。
  3. 在第一个示例中,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

在您的第二个版本中,您在函数内部没有varfunction y声明,因此它会访问全局变量。

有关详细信息,请参阅

What is the scope of variables in JavaScript?