Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌套函数是否影响全局变量(在同一函数中声明)?_Javascript_Hoisting - Fatal编程技术网

Javascript 嵌套函数是否影响全局变量(在同一函数中声明)?

Javascript 嵌套函数是否影响全局变量(在同一函数中声明)?,javascript,hoisting,Javascript,Hoisting,在上面的代码中,b=7使b自动全局化,从而将var b的值更改为7。但当按如下方式添加嵌套函数b时,我对输出结果感到困惑: var b = 4; function f() { b = 7; return b; } a = f(); console.log(a); //output: 7 console.log(b); //output: 7 在我看来,由于函数b在函数f中起作用,首先在激活对象上创建对函数b的引用,当解释器到达b=7时,我们已经看到属性名b存在,因此代码b=7不做任何

在上面的代码中,
b=7
使b自动全局化,从而将
var b
的值更改为7。但当按如下方式添加嵌套函数b时,我对输出结果感到困惑:

var b = 4;
function f() {
  b = 7;
  return b;
}

a = f();
console.log(a); //output: 7
console.log(b); //output: 7

在我看来,由于函数b在函数f中起作用,首先在激活对象上创建对函数b的引用,当解释器到达
b=7
时,我们已经看到属性名b存在,因此代码
b=7
不做任何事情并继续,因此
console.log(b)
输出
4
。但是为什么
console.log(a)
仍然输出
7
b=7
在这里什么都不做,对吗

对于第一段代码,此断言不准确:

在上面的代码中,b=7使b自动全局化,从而将var b的值更改为7

在语句
b=7
中,b绑定到外部
var b
声明,因此
b=7
在闭包中分配给该
b
变量

在第二段代码中,您对提升的作用有误解。将提升视为简单地将声明移动到其范围的顶部,因此:

var b = 4;
function f() {
  b = 7;
  return b;
  function b() {}
}

a = f();
console.log(a); //output: 7
console.log(b); //output: 4
…表现得好像您这样做了:

function f() {
  b = 7;
  return b;
  function b() {}
}

b=7
行上,您正在为局部变量
b
分配一个新值
7
。因此
返回b返回7。

对于第一个代码块,此断言不准确:

在上面的代码中,b=7使b自动全局化,从而将var b的值更改为7

在语句
b=7
中,b绑定到外部
var b
声明,因此
b=7
在闭包中分配给该
b
变量

在第二段代码中,您对提升的作用有误解。将提升视为简单地将声明移动到其范围的顶部,因此:

var b = 4;
function f() {
  b = 7;
  return b;
  function b() {}
}

a = f();
console.log(a); //output: 7
console.log(b); //output: 4
…表现得好像您这样做了:

function f() {
  b = 7;
  return b;
  function b() {}
}

b=7
行上,您正在为局部变量
b
分配一个新值
7
。因此
返回b
返回7。

“我们已经看到属性名b存在,因此code
b=7
不执行任何操作并继续”-否。它执行一些操作,即分配给函数声明的现有局部变量
b
。在
return
语句中,然后返回该局部变量。如果
b=7
赋值没有执行任何操作,
f()
将返回函数。顺便说一句,您应该真正忘记“激活对象”术语。作用域是一条记录,它有一个变量
b
的条目,而不是一个“属性名”。“我们已经看到属性名b存在,因此代码
b=7
不执行任何操作并继续执行”-否。它执行一些操作,即分配给函数声明的现有局部变量
b
。在
return
语句中,然后返回该局部变量。如果
b=7
赋值没有执行任何操作,
f()
将返回函数。顺便说一句,您应该真正忘记“激活对象”术语。作用域是一条记录,它有一个变量
b
的条目,而不是一个“属性名”。