如果JS函数名与外部函数的参数同名,会发生什么?

时间:2017-08-25 14:47:43

标签: javascript scope

当var a中的函数与参数同名时,为什么下面的JS代码工作,即选项?



var fn = function(option) {
  var a = {
    option: function() {
      return option
    }
  }
  return {
    invoke: a.option
  }
}

console.log(fn("B").invoke()); //"B"




2 个答案:

答案 0 :(得分:2)

其中一个选项声明是传递给函数的协议,另一个是对象键。

fn("B") // sends B to the option method. 

fn("B").invoke() // sends B to the option method and the invokes the value to be called.

option方法将参数存储为私有变量。 Invoke使用该私有变量。

答案 1 :(得分:1)

首先,您问题中的代码:As adeneo said,根本没有冲突。 option参数和option属性存在于两个完全不同的名称空间中。该参数是函数*调用的上下文的一部分,而该属性是对象的属性。在你的外部函数中,option引用参数,a.option(赋值后)引用内部函数。

但是你的头衔:

  

如果JS函数名与外部函数的参数同名,会发生什么?

这是一个非常不同的事情。它看起来像这样:



var fn = function(option) {
    console.log(typeof option); // "function"
    function option() {
      // ...
    }
};
fn("B");




在这种情况下,存在冲突,函数中的函数声明获胜,覆盖参数。

*具体而言,通过调用函数创建的执行上下文的Environment Record