变量和函数同名clobbering

时间:2017-11-20 23:39:42

标签: javascript

在以下代码中:

//global scope
function isValid() {
  return "hello from isValid";
}


function test() {
  //local scope
  var isValid = 9;
  //.....
  isValid();
}

test();

我收到错误:

"TypeError: isValid is not a function
    at test (devicok.js:10:5)
    at devicok.js:12:1
    at https://static.jsbin.com/js/prod/runner-4.1.1.min.js:1:13850
    at https://static.jsbin.com/js/prod/runner-4.1.1.min.js:1:10792"

为什么这时我理解isValid函数是in a different scope而不是isValid变量?似乎变量覆盖了函数定义。即使它们具有不同的范围,它们共享相同的命名空间的问题是什么?

Code and error presented in jsbin.

2 个答案:

答案 0 :(得分:3)

JavaScript中没有名称空间 - 函数和变量以及一切都存在于一个名称空间中。是的,外部变量被内部声明遮蔽 - 当你在函数中引用isValid时,它是局部变量。其值为9,而不是函数值,因此在调用时会抛出异常。

答案 1 :(得分:0)

您可以执行以下操作;

//global scope
function isValid() {
  return "hello from isValid";
}


function test() {
  //local scope
  var isValid = 9;
  //.....
  return this.isValid();
}

console.log(test());