关于声明变量和函数的作用域

35 阅读1分钟
  • console.log(a); // 函数会经过预加载提前到上面 所以这个时候打印的是一function

  • console.log(a()); // 这个时候执行a方法

  • var a=1; //这里的 相当于最上面var了a 这里赋值a=3

  • function a(){ //这里声明a为一个函数 console.log(1); }

  • console.log(a); // 这里是直接打印a 上面已经能给赋值为1了

  • a=3 // 这里是声明a=3

  • console.log(a()) // 这个时候a变成了3 所以没办法调用

  • var a=2; //这里涉及到的一个点就是函数声明和变量声明都会被提升。但是一个值得注意的细节 (这个细节可以出现在有多个“重复”声明的代码中) 是函数会首先被提升,然后才是变量。

  • function a() {
    console.log(3); }

  • console.log(typeof a); // nmber

//欺骗(被弃用) function foo(obj) { with (obj) { a = 2; } }

var o1 = { a: 3 };

var o2 = { b: 3 };

foo( o1 ); console.log( o1.a ); // 2 // foo( o2 );(因为是非严格模式 但当我们将 o2 作为作用域时,其中并没有 a 标识符,因此进行了正常的 LHS 标识符查找) o2 的作用域、foo(..) 的作用域和全局作用域中都没有找到标识符 a,因此当 a=2 执行

时,自动创建了一个全局变量(因为是非严格模式) console.log( o2.a ); // undefined console.log( a ); // 2——不好,a 被泄漏到全局作用域上了!