JS常见输入输出题01

170 阅读1分钟
for (var i = 0; i < 2; i++) {
    setTimeout(function () { console.log(i) }, 0)
}
//2 2
//原理:var只有全局作用域+变量提升

for (var i = 0; i < 2; i++) {
    (function (i) {
        setTimeout(function () { console.log(i); }, 0)
    }(i))
}
//0 1
//原理:闭包特性

class Phone {
    constructor(price) {
        this.price = price;
    }
    get price() {
        return 999;
    }
}
var p = new Phone(888);
console.log(p.price);
//抛出异常
//只能有一种getter方式

(function() {
    var x=foo();
    var foo=function foo() {
        return "foobar"
    };
    return x;
})();
//报错抛出异常
//原理是变量提升只能提升声明不能提升初始化

console.log(num); // Returns undefined同一个原理,只能提
var num;
num = 6;

num = 6
console.log(num)//6
var num;

console.log(num)
var num = 6//undefined

num = 6
console.log(num)//报错 没有声明init
let num;

let num
console.log(num)//undefined
num = 6

//函数可以提升全部信息
foo()//111
function foo(){
    console.log(111)
}

//var不行
foo()//foo is not a function
var foo = function(){
    console.log("111")
}

function foo(){
    function bar(){
        return 3;
    }
    return bar();
    
    function bar(){
        return 8;
    }
}
console.log(foo())//8

function foo(){
    var bar = function(){
        return 3;
    }
    return bar();
    
    function bar(){
        return 8;
    }
}
console.log(foo())
//3
//因为变量声明的优先级大于函数声明的优先级

-

var a = true
foo()
function foo(){
    if(a){
        var a = 100
    }
    console.log(a)//undefined
}
//在函数内部先判断a的值,因为var存在变量提升
//所以var a = undefined被提升到了函数作用域的顶部
//if(a) == false 导致a无法被赋值

-

function fn(){
    console.log(typeof foo)//'function'
    
    var foo = 'variable'
    
    function foo(){
        return 'function'
    }
    console.log(typeof foo)//'string'
}
fn()
/**
因为变量提升比函数提升的优先级高
所以整个过程实际上如下
function fn(){
    var foo
    function foo(){
        return 'function'
    }
    console.log(typeof foo)//function
    
    foo = 'variable'
    
    console.log(typeof foo)//string
}
fn()
*/

-

function foo(){
    var a = 1
    function b(){
        a = 10
        return
        function a(){}
    }
    
    b()
    console.log(a)//1
}
foo()
/**
function foo(){
    var a
    function b(){
        function(){}
        a = 10
        return
    }
    a = 1
    b()
    console.log(a)//1
}
*/

//小声bb let和const真是伟大的发明