【问题标题】:How a function passes its arguments to its inner function call (not nested new functions) in Javascript?一个函数如何在 Javascript 中将它的参数传递给它的内部函数调用(不是嵌套的新函数)?
【发布时间】:2018-09-13 19:18:16
【问题描述】:

我正在学习 javascript 范围链。当一个变量在函数中声明时,它在另一个函数中是看不到的。比如myVar是在函数a中声明的,在函数b中是看不到的:

function b() {
  console.log(myVar);
}

function a() {
  var myVar = 2;
  b();
}

a(); //->myVar is not defined

但是为什么一个函数可以将它的参数传递给它的内部函数调用(而不是嵌套的新函数)?参数是否应该是函数的局部变量?

function b(str) {
  console.log(str);
}

function a(str) {
  b(str);
}

a("a's argument"); //->"a's argument"

【问题讨论】:

  • JS中的一切都是传值的,对象和数组也是传值的,为什么这些值不能传给程序员想要的函数?

标签: javascript scope arguments


【解决方案1】:

是的,但是当您将 str 属性显式传递给 b 函数时,它是有效的。

什么不应该工作:

function b() {
  console.log(str);
}

function a(str) {
  b();
}

a("a's argument"); //->undefined

【讨论】:

    【解决方案2】:

    示例中的两个变量具有相同名称这一事实没有任何意义,因为它们是在不同的范围内定义的。

    当你在a函数中时

    b(str);
    

    您正在做的是将函数a 中的参数str 的值复制到另一个变量,即函数b 中的参数str。 在内部,变量只是引用内存地址的简单方法。当您调用 b(str) 时,您将复制到 b->str 中的相同值 a->str 保持不变,但最后,您有两个不同的内存地址包含相同的值(a's argument 字符串的指针)。

    JavaScript 解释器/编译器知道它们是两个不同的地址,因为它们属于两个不同的作用域。

    如果你这样做:

    function b(str) {
       setTimeout(function() { console.log(str) }, 1000);
    }
    
    function a(str) {
       b(str);
       str = 'new value';
       console.log(str);
    }
    
    a("a's argument");

    你会看到,尽管在a 中更改了b->str 的值,但当b 中的setTimeout 执行时,它会注销原始值,即使它是在console.log 之后记录的在 a 中显示更改的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多