1、预解析
(1)变量提升
function foo() {
var a = 1;
console.log(a); //1
console.log(b);//undefined
var b = 2;
}
foo();
在作用域内变量、函数会被提升声明 先声明 等代码执行阶段再赋值
js是这样解析的
function foo() {
var a;
var b;
a = 1;
console.log(a); // 1
console.log(b); // undefined
b = 2;
}
foo();
(2)变量提升与函数提升的顺序
让我们看看规则:
1. 变量声明、函数声明都会被提升到作用域顶处;
2. 当出现相同名称时,优先级为:变量赋值>函数声明>变量声明
// 代码段1
function foo() {
var a;
function a() {}
console.log(a);
}
foo(); //没有赋值操作,值为a(){}
// 代码段2
function foo() {
var a = 1;
function a() {}
console.log(a);
}
foo(); //有赋值操作,值为1
所以变量一旦有赋值,优先级在最前面
举个栗子,num的值为?
var foo=function(x,y){ //注意foo被赋值
return x-y;
}
function foo(x,y){
return x+y;
}
var num=foo(1,2);
num的值为-1
(3)形参与实参
形参为局部变量,在没有和实参统一时,访问时值为undefined
function fn(a, c) {
console.log(a); //undefined
}
fn()
当混合时
function fn1(a, c) {
console.log(a); //undefined function a(){}
var a = 123;
console.log(a); // undefined function a(){} 123 最后为123
console.log(c); //undefined function c(){}
function a() { };
if (a == 8) {
var d = 678;
}
console.log(d); //undefined
console.log(b); // undefined 这里b为变量,下一步才是赋值
var b = function () { };
console.log(b); // undefined function b (){}
function c() { };
}
fn1();
这里还有个问题 ,里面的条件判断为假,怎么获取到d的值为undefined,希望大家指导