为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千巷猫影 2019-03-20 18:15:33
如下:是一段MDN上的一段代码var x = 0;function f(){  var x = y = 1; // x在函数内部声明,y不是!}f();console.log(x, y); // 0, 1// x是全局变量。// y是隐式声明的全局变量。问:1.为什么结果是 0,12.代码注释为什么说“x在函数内部声明,y不是!”3.什么样的算是隐式声明的全局变量基于以上,我改变了一下代码,如下:function f(){var a = b = 1; }f();console.log(b);// 1console.log(a);// a is not defined问:为什么a is not defined麻烦会的同学帮忙解答一下,谢谢!
查看完整描述

3 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

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的局部变量,无法在局部作用域外部访问


查看完整回答
反对 回复 2019-04-05
?
慕斯王

TA贡献1864条经验 获得超2个赞

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


查看完整回答
反对 回复 2019-04-05
?
手掌心

TA贡献1942条经验 获得超3个赞

使用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试试


查看完整回答
反对 回复 2019-04-05
  • 3 回答
  • 0 关注
  • 545 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信