全局变量与隐式声明的全局变量。

如下:是一段MDN上的一段代码

var x = 0;
function f(){
  var x = y = 1; // x在函数内部声明,y不是!
}
f();
console.log(x, y); // 0, 1
// x是全局变量。
// y是隐式声明的全局变量。

问:
1.为什么结果是 0,1
2.代码注释为什么说“x在函数内部声明,y不是!”
3.什么样的算是隐式声明的全局变量

基于以上,我改变了一下代码,如下:

function f(){var a = b = 1; }
f();
console.log(b);// 1
console.log(a);// a is not defined

问:为什么a is not defined

麻烦会的同学帮忙解答一下,谢谢!

阅读 3k
3 个回答
1.为什么结果是 0,1

两个点。
1.var x = y = 1 等价于 var x; x = y = 1
即跳过了y的声明,直接创建了全局变量y
2.console.log(x,y)访问的x,y都是全局变量,答案就很明显了

2.代码注释为什么说“x在函数内部声明,y不是!”

原因见上个回答第一点

3.什么样的算是隐式声明的全局变量

除去宿主环境本身的变量,其他所有未经var/let/const创建的全局变量都是“隐式声明的全局变量”

问:为什么a is not defined

还是见第一个回答的第一条,a是函数f的局部变量,无法在局部作用域外部访问

javascript有非常多诡异的现象, 针对这些问题, 我们尽量选择避免就好.

使用var定义的变量,使用范围局限于当前作用域和子作用域。

你的代码可以等价于:

var x = 0;
var ccc = 3;

function f(){
  // y没有var约束,会寻找上一级的作用域,显然上一级也没有定义y,那算是全局的了
  y = 1;
  // x用var定义,那么相当于是一个新的变量`var x_new_define = y`
  // 此时请忘记外部的x,这个函数被新的x占用,两个x毫不相关
  var x = y;
  // z只局限于当前(函数内)作用域,出不了这个函数
  var z = 1;

  // 没有var约束,找上一级,上一级有ccc的var约束
  ccc = 5;
}

f();

console.log(x, y); // 0, 1
// 这个作用域没有z,肯定要报错的
console.log(z); // throw Error

console.log(ccc); // 5

总的来说,你现在还不理解js的基础部分,建议多看下书,尤其是作用域相关的知识点,然后多写几个小demo试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题