作用域以及变量提升

函数的作用域

从函数定义到执行: 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’);

}

这段代码的执行结果:

image.png

说明:这段代码报的错误为TypeError, 而非 ReferenceError. 说明找到了这个声明但这个声明并不是一个函数。

*
TypeError: 在作用域内找到,但是并不是可执行的类型
ReferenceError: 在作用域内未找到。*

你可能感兴趣的:(作用域以及变量提升)