js中关于作用域(var定义的变量)的解析:

定义全局变量的两种方式:
①.带var定义的变量:会将声明提升到全局作用域的顶端。

console.log(a);//undefined
var a = ‘哈哈’;
console.log(a);//哈哈
//解析:在控制台打印第一个a输出undefined是因为a在下面用var定义了。

声明提升情况如下:

var a;
console.log(a);
a = ‘哈哈’;
console.log(a);

但是第一个console.log(a);怎么知道下面声明a了呢?
js的预解析: js会优先去找在全局中用var声明的变量,将声明提升到全局作用域的顶端。
②.不带var定义的变量:必须是声明+赋值,变量的声明不会提升,否则会报错。

a = 5;
console.log(a);//5
//如果把a写在下面,直接打印a会报错
console.log(a);//报错
a = 5;

在函数中用var定义的变量是函数中的局部(私有)变量,从外界是无法访问的。
在函数中用var定义的变量,声明会提升到函数作用域的顶端。
在函数中没有用var定义的变量,一定是函数上一层作用域的。
函数中定义了形参a,如果在函数调用时不传参数,相当于在函数内部定义了a但是未赋值。
在函数调用时传实参,但写函数时没有写形参,实参时传不过去的。

  var a = 5;
  function fn() {
    var a = '哈哈';
    console.log(a);//哈哈  函数fn内的a
  }
  fn();
  console.log(a);//5  外部的a


  var a = 5;
  function fn() {
    a = '哈哈';
    console.log(a);//哈哈
  }
  fn();
  console.log(a);//哈哈
  /*调用函数fn();  由于在函数内部没有定义a,a = '哈哈';是外部的a,
  把var a = 5;中的a覆盖了,函数中打印的a是外部被覆盖掉的a,
  函数外打印的a还是外部被覆盖掉的a*/
  

  function fn() {
    console.log(a);//undefined
    var a = '哈哈';
    console.log(a);//哈哈
  }
  fn();
  /*调用函数fn();  函数中打印的第一个a是函数内部的,变量提升到函数作用域顶端的a,
  声明了但未赋值,函数中打印的第二个a是赋值为哈哈后的a*/


  var a = 5;
  function fn(a) {
    a = '哈哈';
    console.log(a);//哈哈
  }
  fn(0);
  console.log(a);//5
  /*调用函数fn(0);  把实参0传递给形参a,此时相当于在函数内部声明a并赋值为0,
  var a = 0,函数内部的a = '哈哈';会把a=0覆盖掉,所以内部打印的是哈哈,
  外部打印的还是外部的a,是5*/


  var a = 5;
  function fn() {
    console.log(a);//5
    a = '哈哈';
  }
  fn('嘿嘿');
  console.log(a);//哈哈
  /*调用函数fn('嘿嘿');  实参嘿嘿传不到函数中,因为函数中没有形参,函数中打印的a
  依然是外部的a是5,接着a = '哈哈';把函数外部的a=5覆盖了,所以函数外部打印的a是
  哈哈*/

  var a = 5;
  function fn(a) {
    console.log(a);//5
    a = '哈哈';
  }
  fn(a);
  console.log(a);//5
  /*调用函数fn(a); 由于外部声明赋值了var a = 5;,所以把实参5传给了函数的形参a,
  相当于在函数内部声明并赋值了var a = 5;然后在函数内部打印a
  是5,然后函数内部的a = '哈哈';把函数内部的var a = 5;中的a覆盖了。
  在函数外部打印的a依然是外部的a,所以是5*/
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值