作用域问题

来源:4-1 全局作用域和局部作用域

猫有一只猫

2019-11-21 11:18:31

let s = 'hello';
for (let i = 0; i < s.length; i++) {
  console.log('1'+i);
}
console.log('2'+i);


if (true) {
  var name='ming';
  console.log(name);
}
console.log(name);


var n=3;
function fn() {
  // var a='hehe';
  console.log('3'+n);
  n=4;
}
fn();
console.log('4'+n);


function fn2 () {
  var m=4;
}
console.log(m);

1.当for和if里面的i和name用var声明时不应该算是局部变量吗?为什么在for和if的外面也能获取到i和name?当用let声明时就不能获取,是因为let默认将变量作用域绑定在代码块内吗?

2.同样的,在函数fn2里面用var声明m,在外面就获取不到m,这是为什么?for、if和function有什么区别吗?难道for这样的不算做函数?

3.用var声明的是局部变量,不用var声明的是全局变量,在fn外面和里面都有n,那么这两个n是同一个变量吗?在栈中的地址一样吗?还是说全局的n覆盖了局部的n?

4.视频讲的细,但是有点老,视频中的老师说js没有块级作用域,现在已经有了。。。


写回答

1回答

好帮手慕夭夭

2019-11-21

同学你好,关于你的问题解答如下:

1. 在JavaScript中(es5中), 只有函数会形成一个局部作用域。即在函数里面使用var定义的变量,才叫做局部变量,其他的都不是。

在es6语法中,花括号{}就会形成一个块级作用域(注意es6中不叫做局部作用域,也需要注意使用{}定义的对象不是块级作用域,到后面阶段就会学习了)。块级作用域中定义的变量就是局部变量。因为let是es6的语法,使用let定义,会作为es6语法去解析。所以在if ,for这些都是块级作用域定义变量就是局部变量。

2.for不是函数,只有通过function定义的才叫做函数。具体参考第一个回复。

3. 在js中,只有在函数中使用var才叫做局部的,其他的都是全局的。同学说的是如下情况吗?

http://img.mukewang.com/climg/5dd62f6e09dcc6fa03020125.jpg

第一个n是全局的,第二个是局部的。如果函数中已经定义了n, 那么函数就会使用自己当前作用域下面的n,不会使用全局的n。

如果函数中使用的变量没有使用var定义,那么它才会往上一层查找变量。即如下都是全局变量n。

http://img.mukewang.com/climg/5dd62fc109564bfe04900127.jpg

4.  js语法中,没有块级作用域这个概念的。同学说的是es6 , 不同的语法,区分一下。另外,建议同学目前先跟着老师学习js的语法。暂时不要想块级作用域这个概念,不然同学学习js时,很容易混淆。等后面学习到了es6 , 就理解了。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0

0 学习 · 14456 问题

查看课程