JavaScript变量提升、函数作用域、连续赋值

123 阅读1分钟

1、var变量提升的一道题目

var func = function(){ 
    console.log(a);//执行函数 a:undefined 
    var a = 100; 
} 
console.log("outside_a:" a);//函数中的a属于局部作用域, 报错:引用错误
func(); 

2、自执行函数1: 

var a = 20;
(function a() { 
    var a = 100; var b = 100; 
})(); 
console.log("a", a)//此处a 20 
console.log("b", b)//此处b 报错reference error 

自执行函数2: 

(function a() { 
    console.log(a);//undefined 
    var a = b = 100; 
    console.log("a_after:", a) 
    console.log(b);//100 
})();

自执行函数在外部:

var a = 20; 
(function a() { 
    console.log("自执行函数的this:", this);//全局的window 
    console.log(a) 
    var a = b = 100; 
    console.log("inside_b:", b) 
})(); 
//思考此处outside_a打印为何不是100 ?(连续赋值,变量b相当于window.b=100)
console.log("outside_a:", a);// outside_a: 20 
console.log("outside_b:", b);// outside_b: 100 

3、关于连续赋值: 

var a = b = 100; 

js中的赋值是从右向左,上述连续赋值可以拆分为: 

b = 100; 
var a = b; 

所以:如果在函数中连续赋值,由于函数存在作用域的,所以在函数外部访问不到函数内部的var变量。 

所以:

(function f() {   
    var a = b =100 
})(); 
console.log("a:", a)//a此处会报错:referenceError 
console.log("b:", b)//b为全局的window.b = 100