var a
a = 2
console.log(a);
//2
foo()
function foo() {
console.log(a);
var a = 2
}
//undefined
每个函数的作用域都会进行提升操作,比如foo函数自身也会在内部对var进行提升(不是提升到整个程序的最上放,而是各自作用域的最上放。)
函数声明会被提升,函数表达式不能提升
foo();
var foo = function bar() {
}
// TypeError: foo is not a function
具名函数表达式不能提升
foo()//TypeError: foo is not a function
bar()//ReferenceError: bar is not defined
var foo = function bar() {
}
可以理解为
var foo
foo()
bar()
foo = function () {
var bar =...self...
}
函数声明和变量声明都会被提升,但函数优先
foo()
var foo
function foo() {
console.log(1);
}
foo = function () {
console.log(2);
}
区分TypeError和ReferenceError
1.首先:字面上的意思分别为引用错误和类型错误;
2.作用域:ReferenceError就是在作用域中找不到、TypeError是在作用域中找到了但是 做了它不可能做的事情。(比如,用一个变量接收的函数对象,不可能以函数的形式调用)