奇怪的代码
·
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)
//如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。 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);
//词法作用域,第一个 number 是 window.number //第二个是 fn.call(arguments),arguments 里没有 number,故为 undefined
for(
let i = (setTimeout( ()=>console.log(i),2333),0);
i<2;
i++
){
console.log(i)
}
首先明确逗号表达式
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