# 下面代码的输出是什么?

function test(a){
a=a+10;
}
var a=10;
test(a);
console.log(a);
解析

10
a是形参属于局部变量,修改形参不影响全局变量a的值,因此输出的a是全局变量的值10

let x = 10;
let foo = () => {
console.log(x);
let x = 20;
x++;
}
foo();
解析

抛出 ReferenceError
这道题是暂时性死区的问题。只要在一个block里,let是后边定义的,就不能在之前引用该变量。于此同时,也不能去取外层的值了

let node = {
type:"11",
name:"foo",
}
let{type,name,value}=node;
console.log(type,name,value)
答案

11 foo undefined

setTimeout(function(){
    console.log(1)
},0)
new Promise(function E(resolve){
    console.log(2)
    for(var i = 0;i<1000;i++){
        i==9999&&resolve()
    }
    console.log(3)
}).then(function(){
    console.log(4)
})
console.log(5)
答案

2 3 5 1

let a =101;
let b = a >100&&(a=70);
let d = (a>50)||(a=25)
console.log(a,b,d)
答案

70 70 true

(function(){
  var x=y=1;
})()
console.log(y)
答案

x is not defined

function test(x,y,z){
console.log(test.length);
console.log(arguments.length)
console.log(arguments[2])
}
test(1,2)
答案

3
2
undefined

[] == ![]
答案

true

理解

var b = 123;
if(true){
    function b () {}
    b = 333;
    console.log(b,'?',window.b)
}
console.log(b,window.b)
    
?

是啥呢🐷


function a() {}
  var a
  console.log(typeof a)
?

结果为:function
先执行变量提升, 再执行函数提升


if (!(b in window)) {
    var b = 1
  }
console.log(b)
?

结果为:undefined


var c = 1
function c(c) {
  console.log(c)
  var c = 3
}                  //这儿的代码变量提升的时候早就执行好了
c(2)
?

结果为会出错。先执行函数提升,后执行变量提升,最后执行变量赋值,即c = 1,此时typeof c结果为number

for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(new Date, i);
    }, 1000);
}
console.log(new Date, i);
//如果想要分别在0-4秒输出一个5要怎么做呢
for (var i = 0; i < 5; i++) {
    (function(j) {  // j = i
        setTimeout(function() {
            console.log(new Date, j);
        }, 1000);
    })(i);
}
console.log(new Date, i);
//
var i=8;
for (var i=0;i<5;i++){
	setTimeout(function(){
	console.log(new Date,i)},i*1000)
}
console.log(new Date,i)//5
var a = function a(){
	console.log(a===a)
}
a();//true

我是猪吗🐷为什么不确定

//true

var arr = new Array(5).toString();
console.log(arr)
🐷

//,,,,

var a = {
    b:18,
    c:{
        a:8,
        d:function(){
            console.log(this.a)
        }
    }
}
var one = a.c.d
console.log(one());
console.log(a.c.d());
🐷!第二次错了

{b:18,c:{a:8,d:function(){console.log(this.a)}}}

8

var a = {n: 1}
var b = a
a.x = a = {n: 2}
console.log(a.n, b.n);
console.log(a.x, b.x);
解析

var b = a; 此时b和a指向同一个对象. b = {n:1}
.运算符比=运算符高,所以先计算a.x
b = {n:1,x:undefinde}
a.x = a = {n:2}; 计算完a.x,再计算 = ,赋值是从右向左的,此时a指向一个新对象
a = {n=2}
再把结果赋值给a.x,
b = {n:1,x:{n=2}}

var name = 'banana';
(function () {
    if (typeof name === 'undefined') {
        var name = 'apple'
        console.log(name)
    } else {
        console.log(name)
    }
})();
解析

apple

var a = 10;  
function test() {  
    a = 100;  
    console.log(a);  
    console.log(this.a);  
    var a;  
    console.log(a); 
}
test(); 
解析

100
10
100

var val=1;
var obj={
    val:2,
    del:function(){
        console.log(this);                    
        this.val*=2
        console.log(val) 
    }
}
obj.del();
let name = "banana";
function change(name){
    name = "lhz"
}
change(name);
console.log(name)
解析

banana
函数的参数是按值传递的
这个栗子中,name把banana这个值穿给了函数,函数又把这个值赋值给了一个局部变量name,改变这个局部变量并不会影响外部的局部变量。

var test=a=>b=>c=>d=>{return a+b+c+d};
test(1)(2)(3)(4)
解析

10