男胖友de部落格

奇怪的代码

· nanpangyou
<!Doctype html>
<script>
  const x = "sfds";
  console.log(typeof x);   //String
  console.log(typeof window.x);    //undefined
</script>
<script>
  console.log(typeof x);    //String
  console.log(typeof window.x);    //undefined
</script>

// es6 开始,let, const, class 声明的全局变量,不属于顶层对象的属性, 上下两个的作用域都是全局

const arr = new Array(5).fill([])
arr[0].push('hi')
console.log(arr)

fill数组的结果 //如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。 MDN: 当一个对象被传递给 fill 方法的时候, 填充数组的是这个对象的引用。

var number = 10;
function fn() {
  console.log(this)
  console.log(this.number);
}
var obj = {
  number: 2,
  show: function(fn) {
    this.number = 3;
    fn();
    arguments[0]();
   },
};
obj.show(fn);

argument[0]调用 //词法作用域,第一个 number 是 window.number //第二个是 fn.call(arguments),arguments 里没有 number,故为 undefined

for(
  let i = (setTimeout( ()=>console.log(i),2333),0);
  i<2;
  i++
){
  console.log(i)
}

for和let的魔法.jpg 首先明确逗号表达式 let a = 1,2 //a === 2 let a = (1,2) //a===2 那么在for循环的第一个部分里面,i的初始值为0. 所以循环体内部的console.log(i)才会依次打出0,1

在2333毫秒后输出的0则为for的初始条件内部的console.log 输出0是因为let i = (setTimeout( ()=>console.log(i),2333),0);这一步有单独的作用域(阮一峰es6的书里有写)。在第一次赋值结束后则不会对这个里面的i进行影响。所以条件内部的console.log输出的为0