函数如何将其参数传递给Javascript中的内部函数调用(而不是嵌套的新函数)?

时间:2018-04-04 09:29:08

标签: javascript scope arguments

我正在学习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"

2 个答案:

答案 0 :(得分:0)

是的,但是当您将function b() { console.log(str); } function a(str) { b(); } a("a's argument"); //->undefined 道具明确传递给b函数时,它才有效。

什么不该起作用:

format_number

答案 1 :(得分:0)

您的示例中的两个变量具有相同的名称这一事实并不意味着什么,因为它们在不同的范围内定义。

在功能a中执行

b(str);

您正在做的是将函数str中参数a的值复制到另一个变量,函数str中的参数b。 在内部,变量只是引用内存地址的简单方法。当您致电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");




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