函数的作用域
从函数定义到执行: 1.编译 2.执行。函数的作用于在编译时就已经决定了。
Var name = ‘gf’;
function foo() {
Var name = ’temp’;
function change() {
return name;
}
Return change();
}
foo(); //执行结果为temp;
Var name = ‘gf’;
function foo() {
Var name = ’temp’;
Function change() {
Return name;
}
Return f;
}
foo()(); //执行结果为 temp;
变量提升之 - - 先有鸡先有蛋
第一段代码
a = 2;
Var a;
console.log(a); //2
第二段代码
console.log(a);
Var a = 2; //undefined
为什么第一段代码执行结果为2呢?这里简要解释一下。
包含函数和变量在内的声明都会在任何代码执行之前声明。当我们看到 var a = 2, 会看成为是一个声明,但其实javascript 会看成为两个声明。 1.var a; 2. a=2; var a 会在程序编译时执行, 而 a = 2 则会在原地等待。
所以第一段代码可以解释为:
编译时: var a;
执行时: a = 2; console.log(a);
所以从严格意义上来说代码还是一行一行执行。
第二段代码解释为:
编译时: var a;
执行时: console.log(a); //所以此时结果为undefined; a = 2;
函数声明的提升
Foo();
Function foo() {
Console.log(‘foo’);
}
此函数可以正常执行:
1. 编译时: 声明 函数foo
2. 执行时: 执行 foo
函数表达式不可提升
foo();
Var foo = function ( ) {
console.log(‘foo’);
}
这段代码的执行结果:
说明:这段代码报的错误为TypeError, 而非 ReferenceError. 说明找到了这个声明但这个声明并不是一个函数。
*
TypeError: 在作用域内找到,但是并不是可执行的类型
ReferenceError: 在作用域内未找到。*