作用域问题
来源: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回答
同学你好,关于你的问题解答如下:
1. 在JavaScript中(es5中), 只有函数会形成一个局部作用域。即在函数里面使用var定义的变量,才叫做局部变量,其他的都不是。
在es6语法中,花括号{}就会形成一个块级作用域(注意es6中不叫做局部作用域,也需要注意使用{}定义的对象不是块级作用域,到后面阶段就会学习了)。块级作用域中定义的变量就是局部变量。因为let是es6的语法,使用let定义,会作为es6语法去解析。所以在if ,for这些都是块级作用域定义变量就是局部变量。
2.for不是函数,只有通过function定义的才叫做函数。具体参考第一个回复。
3. 在js中,只有在函数中使用var才叫做局部的,其他的都是全局的。同学说的是如下情况吗?
第一个n是全局的,第二个是局部的。如果函数中已经定义了n, 那么函数就会使用自己当前作用域下面的n,不会使用全局的n。
如果函数中使用的变量没有使用var定义,那么它才会往上一层查找变量。即如下都是全局变量n。
4. js语法中,没有块级作用域这个概念的。同学说的是es6 , 不同的语法,区分一下。另外,建议同学目前先跟着老师学习js的语法。暂时不要想块级作用域这个概念,不然同学学习js时,很容易混淆。等后面学习到了es6 , 就理解了。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
相似问题