变量提升

函数声明提升大于变量提升
function a() {}
var a;
console.log(a); // function a() {}
函数声明提升大于变量提升; 但如果变量被赋值, 会覆盖函数声明
var b = 1;
function b() {}
console.log(b); // 1

(function c() {})(); // IIEF 类似于函数表达式的右边, 函数名不能被访问到
console.log(c); // ReferenceError: c is not defined

var d = function e() {};
console.log(e); // ReferenceError: e is not defined
函数内部用var定义了和外部同名变量,函数将不再向上找外部的变量
var f = 10;
(function f() {
    console.log(f); // undefined; 由于下面f声明时的提示
    var f = 100;
    console.log(f); // 100
})();
console.log(f); // 10
函数参数对象和内部都没有声明该变量,函数将向上去外部找这个变量
(function g() {
    console.log(g); // function g() { console.log(g) }
})();

var h = function i() {
    console.log(i); // function i() {console.log(h)}
};
h(); 
函数内部声明的变量属于函数内部作用域, 不会影响其外部的同名对象
var j = 10;
function k() {
    var j = 100;
    console.log(j); // 100
}
k();
console.log(j); // 10

// 如果改变的是同一个变量就会影响
var l = 10;
function m() {
    l = 100;
    console.log(l); // 100
}
m();
console.log(l); // 100

var obj = { q10};
(function r() {
    console.log(obj); // undefined, 由于下面的变量提升
    var obj = {s100};
    console.log(obj); // {s: 100}
})();
console.log(obj); // {q:10}

// 如果改变的是统一变量就会影响
var obj = { t10};
(function u() {
    console.log(obj); // { t: 10};
    obj1.t = 100;
    console.log(obj); // { t: 100};
})();
console.log(obj); // {t:100}
原文地址:https://www.cnblogs.com/rencoo/p/10197444.html