zoukankan      html  css  js  c++  java
  • JS基础-作用域

    作用域相关问题

    下面的代码打印什么内容,为什么?

    // 情况 1 
    
    //  情况 2
    var b = 10;
    var c = function b() {
      b = 20;
      console.log(b)
    }
    c()
    
    // 上面两种都打印:
    ƒ b() {
      b = 20;
      console.log(b)
    }
    

    b函数(函数表达式定义函数)是一个相当于用const定义的常量,内部无法进行重新赋值,如果在严格模式下,会报错"Uncaught TypeError: Assignment to constant variable."

    简单改造下面的代码,使之分别打印 10 和 20

    var b = 10;
    (function b() {
      b = 20;
      console.log(b)
    })()
    

    打印10:

    var b = 10;
    (function b(b) {
      window.b = 20;
      console.log(b)
    })(b)
    
    var b = 10;
    (function b() {
      b.b = 20;
      console.log(b)
    })()
    

    打印20:

    var b = 10;
    (function b(b) {
      b = 20;
      console.log(b)
    })()
    
    var b = 10;
    (function b() {
      var b = 20;
      console.log(b)
    })()
    

    下面代码输出什么

    var a = 10;
    (function () {
        console.log(a)
        a = 5
        console.log(window.a)
        var a = 20;
        console.log(a)
    })()
    

    依次输出:undefined -> 10 -> 20

    解析:

    在立即执行函数中,var a = 20; 语句定义了一个局部变量 a,由于js的变量声明提升机制,局部变量a的声明会被提升至立即执行函数的函数体最上方,且由于这样的提升并不包括赋值,因此第一条打印语句会打印undefined,最后一条语句会打印20。

    由于全局的var 会挂载到window对象下,并且立即执行函数里面有变量提示。
    ‘a = 5;’这条语句执行时,局部的变量a已经声明,因此它产生的效果是对局部的变量a赋值,此时window.a 依旧是最开始赋值的10

    var变量定义提升

    var name = 'Tom';
    (function() {
    if (typeof name == 'undefined') {
      var name = 'Jack';
      console.log('Goodbye ' + name);
    } else {
      console.log('Hello ' + name);
    }
    })();
    

    输出: 'Goodbye Jack'

    今天你学习了吗!!!
  • 相关阅读:
    查看linux cpu和内存利用率__linux - top命令
    Maven仓库管理Nexus(转帖后加强版)
    实现系统菜单的两种方式
    使用Iterator遍历数组
    Android自定义退出弹出框
    AsyncTask的学习
    Android中常用到的权限
    Java集合
    Android中以文件的形式保存数据
    Android仿微信的开机滑动界面
  • 原文地址:https://www.cnblogs.com/nayek/p/11729939.html
Copyright © 2011-2022 走看看