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

如下:是一段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


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


千巷猫影
浏览 546回答 3
3回答

慕后森

1.为什么结果是 0,1两个点。1.var x = y = 1 等价于 var x; x = y = 1即跳过了y的声明,直接创建了全局变量y2.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 Errorconsole.log(ccc); // 5总的来说,你现在还不理解js的基础部分,建议多看下书,尤其是作用域相关的知识点,然后多写几个小demo试试
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript